我有一个会话对象,它被传递了很多,并且在某些时候调用了以下代码行(这是不可避免的):
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)
这打印真...
编辑 这对于评论来说似乎太大了,所以我把它放在这里。
zzzeek 说:“一个过期的对象会通过 Session 自动从数据库中加载新的状态,只要你访问它上面的任何东西,所以没有必要告诉 Session 在这里做任何事情。”
那么我如何让事情以这种方式发生呢?调用 transaction.commit 是错误的,正确的方法是什么?