【发布时间】:2023-03-20 02:58:01
【问题描述】:
我有一个会话对象,它被大量传递,并且在某些时候调用了以下代码行(这是不可避免的):
import transaction
transaction.commit()
这会使会话无法使用(我认为是关闭它)。
我的问题分为两部分:
- 如何检查会话是否仍然有效?
- 有没有快速恢复死机会话的方法?
对于 2:我目前知道的唯一方法是使用 sqlalchemy.orm.scoped_session,然后多次调用 query(...)get(id) 来重新创建必要的模型实例,但这似乎非常低效。
编辑
以下是导致错误的事件序列示例:
modelInstance = DBSession.query(ModelClass).first()
import transaction
transaction.commit()
modelInstance.some_relationship
这是错误:
sqlalchemy.orm.exc.DetachedInstanceError: Parent instance <CategoryNode at 0x7fdc4c4b3110> is not bound to a Session; lazy load operation of attribute 'children' cannot proceed
我真的不想关闭延迟加载。
编辑
在这种情况下,DBSession.is_active 似乎没有表明会话实际上是否还活着并且很好:
transaction.commit()
print(DBSession.is_active)
这将打印 True...
编辑 这似乎太大了,无法发表评论,所以我把它放在这里。
zzzeek 说: “一个过期的对象会通过 Session 自动从数据库中加载新的状态,只要你访问它上面的任何东西,所以没有必要告诉 Session 在这里做任何事情。”
那么,我如何才能让事情发生这样的事情呢?调用transaction.commit是错误的,正确的方法是什么?
【问题讨论】:
标签: session transactions sqlalchemy python-3.2