标签: flask-sqlalchemy

使用WTForms进行表单验证,并使用Flask中的表单数据自动填充SQLAlchemy模型

我有一个表单,我必须验证,然后将数据保存在数据库中.我有一个看起来像这样的SQLAlchemy模型Campaign

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()
class Campaign(db.Model):
    __tablename__ = 'campaigns'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    priority = db.Column(db.SmallInteger)
    starts_at = db.Column(db.Date)
    ends_at = db.Column(db.Date)
    .... bla bla bla
Run Code Online (Sandbox Code Playgroud)

现在我有一个WTForm像这样的验证表单

from flask.ext.wtf import Form, TextField, IntegerField, DateField, Required, NumberRange
class CampaignForm(Form):

    def date_validation(form, field):
        #some validation on date

    name = TextField(validators=[Required()])
    priority = IntegerField(validators=[Required(), NumberRange(min=1,max=100)])
    start_date = DateField(validators=[Required(), date_validation])
    end_date = DateField(validators=[Required(), date_validation])
    ... bla bla bla
Run Code Online (Sandbox Code Playgroud)

现在要验证并保存表单数据,我可以做类似这样的事情 view

code in …

python flask flask-sqlalchemy flask-wtforms

3
推荐指数
1
解决办法
6832
查看次数

flask-sqlalchemy insert未映射

我很难在flask-sqlalchemy中正确实现多对多的关系.它始于重复的标签,现在,很多天后是一个映射问题.公平的警告,我的代码在这些问题蔓延之前更加漂亮.我还添加了一个addproduct.py文件来加速测试.所以这就是.

models.py

1 from app import app, db                                                                                                                                     
2 
3 product_tags = db.Table('association',
4         db.Column('product_id', db.Integer, db.ForeignKey('product.id')),
5         db.Column('tag_name', db.Integer, db.ForeignKey('tag.name'))
6 )
7 
8 class Product(db.Model):                                                                                                                                    
9     id = db.Column(db.Integer, primary_key=True)
10     title = db.Column(db.String(128))                                                                                                                       
11     description = db.Column(db.Text)
12     image = db.Column(db.String(64))
13     link = db.Column(db.String(256))
14     price = db.Column(db.Float())
15     timestamp = db.Column(db.DateTime)                                                                                                                      
16     expiration = db.Column(db.String(6))
17     tags = db.relationship('Tag', secondary=product_tags,                                                                                                   
18             backref=db.backref('product', lazy='dynamic'))
19 
20     def __init__(self, title, description, image, link, price, timestamp, expiration,    tags): …
Run Code Online (Sandbox Code Playgroud)

python database sqlalchemy flask flask-sqlalchemy

3
推荐指数
1
解决办法
7569
查看次数

从至少有2条评论的课程开始,选择评论最多的课程

我正在使用Flask-SQLAlchemy和PostgreSQL.我有以下两种型号:

class Course(db.Model):
    id = db.Column(db.Integer, primary_key = True )
    course_name =db.Column(db.String(120))
    course_description = db.Column(db.Text)
    course_reviews = db.relationship('Review', backref ='course', lazy ='dynamic')

class Review(db.Model):
    __table_args__ = ( db.UniqueConstraint('course_id', 'user_id'), { } )
    id = db.Column(db.Integer, primary_key = True )
    review_date = db.Column(db.DateTime)#default=db.func.now()
    review_comment = db.Column(db.Text)
    rating = db.Column(db.SmallInteger)
    course_id = db.Column(db.Integer, db.ForeignKey('course.id') )
    user_id = db.Column(db.Integer, db.ForeignKey('user.id') )
Run Code Online (Sandbox Code Playgroud)

我想从至少两篇评论中选择最受评论的课程.以下SQLAlchemy查询适用于SQlite:

most_rated_courses = db.session.query(models.Review, func.count(models.Review.course_id)).group_by(models.Review.course_id).\
          having(func.count(models.Review.course_id) >1) \   .order_by(func.count(models.Review.course_id).desc()).all()
Run Code Online (Sandbox Code Playgroud)

但是当我在生产中切换到PostgreSQL时,它给了我以下错误:

ProgrammingError: (ProgrammingError) column "review.id" must appear in the GROUP BY clause or …
Run Code Online (Sandbox Code Playgroud)

postgresql sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
540
查看次数

SQLAlchemy无法连接到localhost上的Postgresql

如果我只能找到它的位置,我确信这是一个很容易修复的错误.这是Flask应用程序的错误:

11:58:18 web.1  | ERROR:xxxxxx.core:Exception on / [GET]
11:58:18 web.1  | Traceback (most recent call last):
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app
11:58:18 web.1  |     response = self.full_dispatch_request()
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
11:58:18 web.1  |     rv = self.handle_user_exception(e)
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
11:58:18 web.1  |     reraise(exc_type, exc_value, tb)
11:58:18 web.1  |   File "/Library/Python/2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
11:58:18 web.1  |     rv = self.dispatch_request()
11:58:18 web.1  |   File …
Run Code Online (Sandbox Code Playgroud)

postgresql sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
4027
查看次数

如何从模型生成的表单中指定所需的小部件(例如TextArea而不是简单的Text输入)?烧瓶SQLAlchemy WTForms

我使用了http://flask.pocoo.org/snippets/60/中的代码片段,通过Flask中的模型创建了WTForms表单。除了仅创建输入字段的事实以外,其他所有方法都工作正常。我希望说明(请参见下面的models.py)成为文本区域。有任何想法吗?

从models.py:

title = db.Column(db.String(55))
description = db.Column(db.Text)
Run Code Online (Sandbox Code Playgroud)

从views.py

MyForm = model_form(MyModel, base_class=Form)
form = MyForm()
return render_template('create.html', form=form)
Run Code Online (Sandbox Code Playgroud)

来自create.html

{% for field in form %}
    {{field.label}}
    {{field}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

输出:

<input id="title" name="title" type="text" value="">
<input id="description" name="description" type="text" value="">
Run Code Online (Sandbox Code Playgroud)

我想要的是:

<input id="title" name="title" type="text" value="">
<textarea id="description" name="description"></textarea>
Run Code Online (Sandbox Code Playgroud)

python flask wtforms flask-sqlalchemy flask-wtforms

3
推荐指数
1
解决办法
2817
查看次数

GeoAlchemy ST_DWithin实现

Hi! I need to implement a query using GeoAlchemy to get all the Points that are near a given Point (for example, within a 10 meter radius). For storing points, i am using Geography fields in my PostGIS database. From the SQLAlchemy documentation I have figured out that i would need to use the ST_DWithin function, but i'm not exactly sure how to implement this function in my Flask application.

Here are the relevant code snippets:

# models.py
class Post(db.Model): …
Run Code Online (Sandbox Code Playgroud)

python postgis sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
1041
查看次数

SQLAlchemy通过引用关系的混合属性进行排序

我的SQLAlchemy模型:

class Cover(db.Model):
    # ... a bunch of other fields ...

    @hybrid_property
    def number_of_requests(self):
        if self.requests:
            return len(self.requests)
        return 0

    @number_of_requests.expression
    def number_of_requests(cls):
        return func.count(cls.requests)

class Request(db.Model):
    # ... a bunch of other fields ...

    # Cover that this request is requesting
    cover_id = db.Column(db.Integer, db.ForeignKey('cover.id')
    cover = db.relationship('Cover',
                        backref=backref("requests", cascade="all, delete-orphan"))
Run Code Online (Sandbox Code Playgroud)

因此,Cover和Request之间存在简单的一对多关系。该number_of_requests混合属性应该返回与特定的覆盖相关的请求数。

现在,在我的Flask路线之一中,我试图按请求数获取前5个Covers。这是现在的样子:

# Get top cover requests
covers = Cover.query.order_by(Cover.number_of_requests).limit(5).all()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这给了

ProgrammingError:(ProgrammingError)缺少表“ request”的FROM子句条目

我怀疑这是因为在number_of_requests(cls)尝试计算requests列表的大小,但是SQLAlchemy尚未在原始查询中包括请求表。有关如何避免该错误的任何想法?

python sql sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
2806
查看次数

使用ORM,声明式样式和关联对象在SQLAlchemy中递归选择(具有有限深度)关系

鉴于:

DIRECTIONS = db.Enum('N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW',
                     name='directions')


class Exit(BaseModel):
    __tablename__ = 'exits'
    src = db.Column(db.Integer, db.ForeignKey('room.id'), primary_key=True)
    dst = db.Column(db.Integer, db.ForeignKey('room.id'), primary_key=True)
    direction = db.Column(DIRECTIONS, primary_key=True)
    from_room = db.relationship('Room', foreign_keys=[dst],
                                backref=db.backref('exits',
                                                   lazy='dynamic'))
    to_room = db.relationship('Room', foreign_keys=[src]))
Run Code Online (Sandbox Code Playgroud)

使用:

SqlAlchemy 0.9.8,PostgreSQL 9.3.5

n给定起始室的情况下,如何以递归方式选择退出到某个深度r

示例(简单地图):

                           E                                               
                          /                                                
                B   C -- D                                                 
                 \ /                                                       
                  A                                                         
                  |                                                         
                  F                                                         
                 / \                                                        
                G   H                                                       
                     \                                                      
                      I
Run Code Online (Sandbox Code Playgroud)

假设关系可以由上面的地图表示,

  • 什么查询会给我所有的房间,从一些任意的房间开始?
  • 如何将上述查询限制为原始房间中的一定数量的"跃点"?
    • 例如,从开始A,选择除了E和之外的所有房间I,通过将深度限制为2.

当然,我可以用Python做到这一点:

rooms …
Run Code Online (Sandbox Code Playgroud)

python postgresql recursion sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
1426
查看次数

SQLAlchemy:UNIQUE约束失败错误,但未设置唯一约束

我将Flask和SQLAlchemy与SQLite结合使用来创建一个应用程序,该程序可跟踪食品储藏室中的物品以及您想要制作的食谱。

我对此很困惑。我有一张表,其中的记录应该具有重复的字段。每次尝试在我的应用程序中为此表创建数据库条目时,都会引发“ IntegrityError:UNIQUE约束失败”。这令人困惑,因为它所引发的列没有显式设置唯一约束。

这是我要插入的表的模型:

class PantryItem(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    amount = db.Column(db.String(12))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<PantryItem %r> % self.name'
Run Code Online (Sandbox Code Playgroud)

这是应该添加到数据库的条目的视图代码:

@app.route('/pantry', methods=['GET', 'POST'])
@login_required
def pantry():

    form = IngredientForm() 
    pantry = PantryItem.query.filter_by(owner=g.user).all()

    if form.validate_on_submit():

        pantry_item = PantryItem(name=form.name.data, amount=form.amount.data, owner=g.user)
        db.session.add(pantry_item)
        db.session.commit()

        flash('You added %s to the pantry.' % pantry_item.name)
        return redirect(url_for('pantry'))

    return render_template('pantry.html', 
               form=form,
               user=g.user,
               pantry=pantry)
Run Code Online (Sandbox Code Playgroud)

这是我提交表单时遇到的错误:

IntegrityError: (IntegrityError) UNIQUE constraint failed: pantry_item.name u'INSERT INTO pantry_item (name, amount, user_id) VALUES …
Run Code Online (Sandbox Code Playgroud)

python database sqlite sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
4075
查看次数

NameError:未定义全局名称"flash"

我正在通过以下教程构建基本的Flask应用程序来学习数据库:https://www.tutorialspoint.com/flask/flask_sqlalchemy.htm我目前正处于需要连接到SQLITE3数据库的位置通过SQLAlchemy.说实话,它并不顺利.我收到此错误:NameError:未定义全局名称'flash'

这是我的app.py.

#!/usr/bin/python

from flask import Flask, render_template, json, request
from flask_sqlalchemy import SQLAlchemy
import sqlite3



conn = sqlite3.connect('test.db')




app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.sqlite3'
db = SQLAlchemy(app)


class Students(db.Model):
    id = db.Column('student_id',db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)

    def __init__(self, name, id):
        self.name = name
        self.id = id

    def __repr__(self):
        return '<Students %r>' % self.name


db.create_all()


@app.route("/")
def main():
    return render_template('index.html')




@app.route('/new', methods = ['GET', 'POST'])
def new():
   if request.method == 'POST':
      if not request.form['name'] or not …
Run Code Online (Sandbox Code Playgroud)

python sqlite sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
3134
查看次数