我希望我的模型的主键是一个自动递增的整数.这是我的模型的样子
class Region(db.Model):
__tablename__ = 'regions'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100))
parent_id = db.Column(db.Integer, db.ForeignKey('regions.id'))
parent = db.relationship('Region', remote_side=id, primaryjoin=('Region.parent_id==Region.id'), backref='sub-regions')
created_at = db.Column(db.DateTime, default=db.func.now())
deleted_at = db.Column(db.DateTime)
Run Code Online (Sandbox Code Playgroud)
上面的代码创建了我的表,但没有id自动增量.因此,如果在我的插入查询中我错过了该id字段,它会给我这个错误
错误:列"id"中的空值违反非空约束
所以我把id声明改成了这样的样子
id = db.Column(db.Integer, db.Sequence('seq_reg_id', start=1, increment=1),
primary_key=True)
Run Code Online (Sandbox Code Playgroud)
还是一样的错误.上面的代码有什么问题?
我们生产中的一个线程遇到了一个错误,现在正在产生InvalidRequestError: This session is in 'prepared' state; no further SQL can be emitted within this transaction.错误,每次请求都有一个查询它服务的余生!现在已经好几天了!这怎么可能,我们如何防止它向前发展?
我们在uWSGI上使用Flask应用程序(4个进程,2个线程),Flask-SQLAlchemy为我们提供了与SQL Server的数据库连接.
当我们的一个生产线程正在拆除它的请求时,问题似乎开始了,在这个Flask-SQLAlchemy方法中:
@teardown
def shutdown_session(response_or_exc):
if app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']:
if response_or_exc is None:
self.session.commit()
self.session.remove()
return response_or_exc
Run Code Online (Sandbox Code Playgroud)
...... self.session.commit()当事务无效时,以某种方式设法调用.这导致sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back输出到stdout,无视我们的日志记录配置,这是有道理的,因为它发生在应用程序上下文拆除期间,这从来不应该引发异常.我不确定如果没有response_or_exec设置,交易如何变得无效,但这实际上是AFAIK的较小问题.
更大的问题是,当"准备好的'状态"错误开始时,并且从那时起就没有停止过.每次这个线程提供命中数据库的请求时,它就是500s.每个其他线程似乎都没问题:据我所知,即使是在同一进程中的线程也没问题.
SQLAlchemy邮件列表中有一个关于"'准备好的'状态"错误的条目,说明如果会话开始提交但尚未完成,而其他东西试图使用它.我的猜测是,这个帖子中的会话永远不会self.session.remove()迈出这一步,现在它永远不会.
我仍然觉得这并没有解释这个会话如何在请求中持续存在.我们还没有修改Flask-SQLAlchemy对请求范围会话的使用,因此会话应该返回到SQLAlchemy的池并在请求结束时回滚,即使是错误的(尽管可能不是第一个,因为在应用程序上下文中引发的内容被拆除了).为什么回滚没有发生?如果我们每次都看到stdout上的"无效事务"错误(在uwsgi的日志中),我就能理解它,但我们不是:我第一次只看到它一次.但每次500秒发生时,我都会看到"准备好的状态"错误(在我们的应用程序日志中).
我们已经关闭expire_on_commit了session_options,我们已经开启了SQLALCHEMY_COMMIT_ON_TEARDOWN.我们只是从数据库中读取,而不是写作.我们还使用Dogpile-Cache进行所有查询(使用memcached锁,因为我们有多个进程,实际上是2个负载均衡的服务器).缓存会在每分钟到期,因为我们的主要查询.
重启服务器似乎已经解决了问题,这并不奇怪.也就是说,我希望能再次看到它,直到我们弄清楚如何阻止它.benselme(下面)建议编写我们自己的拆解回调,并在提交时进行异常处理,但我觉得更大的问题是该线程在其余生中被搞砸了.事实上,在一两个请求之后这并没有消失,这让我很紧张!
我最近切换到Celery 3.0.在此之前,我使用Flask-Celery将Celery与Flask整合在一起.虽然它有许多问题,比如隐藏了一些强大的Celery功能,但它允许我使用Flask app的完整上下文,尤其是Flask-SQLAlchemy.
在我的后台任务中,我正在处理数据,而SQLAlchemy ORM则用于存储数据.Flask-Celery的维护者已经放弃了对该插件的支持.该插件在任务中挑选了Flask实例,因此我可以完全访问SQLAlchemy.
我试图在我的tasks.py文件中复制此行为,但没有成功.你有任何关于如何实现这一目标的提示吗?
当我尝试创建数据库模式迁移时,我遇到了这个奇怪的错误.你能帮我弄清楚出了什么问题吗?
$ python app.py db upgrade
[skipped]
sqlalchemy.exc.ArgumentError: Mapper Mapper|EssayStateAssociations|essay_associations could not assemble any primary key columns for mapped table 'essay_associations'
Run Code Online (Sandbox Code Playgroud)
我的模特:
class EssayStateAssociations(db.Model):
__tablename__ = 'essay_associations'
application_essay_id = db.Column(
db.Integer,
db.ForeignKey("application_essay.id"),
primary_key=True),
theme_essay_id = db.Column(
db.Integer,
db.ForeignKey("theme_essay.id"),
primary_key=True),
state = db.Column(db.String, default="pending")
Run Code Online (Sandbox Code Playgroud) 我正在尝试从我的数据集返回一个总计/平均行,其中包含某些字段的SUM和其他字段的AVG.
我可以在SQL中执行以下操作:
SELECT SUM(field1) as SumFld, AVG(field2) as AvgFld
FROM Rating WHERE url=[url_string]
Run Code Online (Sandbox Code Playgroud)
我将此转换为SQLAlchemy的尝试如下:
totals = Rating.query(func.avg(Rating.field2)).filter(Rating.url==url_string.netloc)
Run Code Online (Sandbox Code Playgroud)
但这是错误的:
TypeError: 'BaseQuery' object is not callable
Run Code Online (Sandbox Code Playgroud) 对,我已经看到了直接存储在主应用程序文件(机型瓶应用的许多例子http://pythonhosted.org/Flask-SQLAlchemy/quickstart.html,http://maximebf.com/blog/2012/10/建设网站-in-python-with-flask /).其他的(http://flask.pocoo.org/docs/patterns/sqlalchemy/)有一个"models.py"文件,其中放置了模型.
如何从单独的文件中取出我的Flask app导入模型,例如"User.py"?当我尝试使用这些内容创建User.py文件时:
from app import db
class User(db.Model):
[...]
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
File "/Users/stackoverflow/myapp/models/User.py", line 1, in <module>
from app import db
ImportError: No module named app
Run Code Online (Sandbox Code Playgroud)
当我插入from models import User我的模块文件.
我正在尝试使用带有SQLALchemy的参数(在一个alembic脚本中)运行这个简单的原始sql语句:
from alembic import op
t = {"code": "123", "description": "one two three"}
op.execute("insert into field_tags (id, field_id, code, description) "+
"values (1,'zasz', :code ,:description')", t)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
sqlalchemy.exc.StatementError: A value is required for bind parameter
'description' (original cause: InvalidRequestError: A value is required for
bind parameter 'description') "insert into field_tags (id, field_id, code,
description) values (1, 'math',
%(code)s ,%(description)s)" []
Run Code Online (Sandbox Code Playgroud)
解决方案:
t = {"code": "123", "description": "one two three"}
from sqlalchemy.sql import text
op.get_bind().execute(text("insert into field_tags (id, field_id, code, description) …Run Code Online (Sandbox Code Playgroud) python sqlalchemy database-migration flask-sqlalchemy alembic
我正在尝试使用alembic来处理我项目的本地迁移.它第一次工作,但后来我需要删除文件夹并重新启动.(不要问为什么,我只是必须)我正在按照本教程运行命令
python manage.py db init
Run Code Online (Sandbox Code Playgroud)
没关系.但是当我试着奔跑的时候
python manage.py db migrate
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
alembic.util.CommandError: Can't locate revision identified by '31b8ab83c7d'
Run Code Online (Sandbox Code Playgroud)
现在,似乎alembic正在寻找不再存在的修订版.无论如何,让alembic忘记那个文件?或者重新启动比较从无到 - >再次自动生成?
我正在使用Flask-SQLAlchemy和Blueprints,我无法使用循环导入.我知道我可以在函数内部编写导入并使其工作但它听起来很讨厌,我想与社区确认是否有更好的方法来做到这一点.
问题是我有一个模块(blueprints.py),我在其中声明数据库并导入蓝图,但这些蓝图需要同时导入数据库声明.
这是代码(重要部分的摘录):
from application.blueprints import db
people = Blueprint('people', __name__,
template_folder='templates',
static_folder='static')
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
@people.route('/all')
def all():
users = User.query.all()
Run Code Online (Sandbox Code Playgroud)
from application.apps.people.views import people
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
app.register_blueprint(people, url_prefix='/people')
Run Code Online (Sandbox Code Playgroud)
我已经阅读了文档和我在这个主题上发现的问题,但我仍然找不到我要找的答案.我已经找到了这一章(https://pythonhosted.org/Flask-SQLAlchemy/contexts.html),它建议将初始化代码放在方法中,但循环导入仍然存在.
编辑 我使用模式Application Factory修复了问题
我有一个User表和一个Friend表.Friend表包含两个外键,包括我的User表和状态字段.我试图能够在Friend对象上调用我的User表中的属性.例如,我希望能够做一些像friend.name或friend.email这样的事情.
class User(Base):
""" Holds user info """
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(25), unique=True)
email = Column(String(50), unique=True)
password = Column(String(25))
admin = Column(Boolean)
# relationships
friends = relationship('Friend', backref='Friend.friend_id',primaryjoin='User.id==Friend.user_id', lazy='dynamic')
class Friend(Base):
__tablename__ = 'friend'
user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
friend_id = Column(Integer, ForeignKey(User.id), primary_key=True)
request_status = Column(Boolean)
Run Code Online (Sandbox Code Playgroud)
当我获得friend对象时我只有2 user_ids并且我希望显示每个用户的所有属性,以便我可以在表单等中使用该信息.我是sqlalchemy的新手 - 仍在尝试学习更多高级功能.这只是一个较大的Flask项目的片段,这个功能将用于friend请求等.我试图查找关联对象等,但我很难用它.
任何帮助将不胜感激.
flask-sqlalchemy ×10
python ×8
sqlalchemy ×7
flask ×6
alembic ×2
postgresql ×2
celery ×1
uwsgi ×1