【发布时间】:2017-12-18 10:02:54
【问题描述】:
我有 Python 3.6、Flask 和 SQLAlchemy (PostgreSQL) 编写的应用程序。
我遇到了在我的数据库中挂起idle in transaction 连接的问题。这可能是因为我在选择查询后不提交也不回滚。
我使用默认的 SQLALchemy 配置:db = SQLAlchemy()
创建悬挂连接的示例端点:
class Test(Resource):
def get(self, pk):
return User.query.get(pk).serialize()
处理此类选择查询的方法是什么?我应该选择然后提交吗?还是选择然后回滚?或请求后完全关闭连接?但是关闭连接会导致每次请求都会打开与数据库的新连接。
最好的方法是什么?
【问题讨论】:
-
不要关闭连接。只是请求结束时的
Session等(如果是线程本地范围的会话,请删除)。有关指针,请参阅flask.pocoo.org/docs/0.12/patterns/sqlalchemy/#declarative,但据我了解,Flask-SQLAlchemy 应该开箱即用。 -
只有在应用拆解时才会删除会话。请求后我该怎么办?回滚?关闭会话?哪种方法更好?另外,如果我关闭会话,未提交/回滚的事务会发生什么?
-
文档中有一篇关于该主题的冗长文章:docs.sqlalchemy.org/en/latest/orm/…。当您将scoped sessions 放入组合中时,您会希望将
remove()注册的Session对象放在合适的位置。删除的会话将为您关闭,从而结束正在进行的事务,释放资源等。 -
我阅读 Flask 文档会暗示
@app.teardown_appcontext处理程序也会在请求后被触发。
标签: python flask sqlalchemy flask-sqlalchemy