我有一个表单,我必须验证,然后将数据保存在数据库中.我有一个看起来像这样的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 …
我很难在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) 我正在使用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) 如果我只能找到它的位置,我确信这是一个很容易修复的错误.这是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) 我使用了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) 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) 我的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尚未在原始查询中包括请求表。有关如何避免该错误的任何想法?
鉴于:
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) 我将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) 我正在通过以下教程构建基本的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) flask-sqlalchemy ×10
python ×8
sqlalchemy ×8
flask ×3
postgresql ×3
database ×2
sqlite ×2
postgis ×1
recursion ×1
sql ×1
wtforms ×1