我不确定我是否理解SQLAlchemy会话在其生命周期中如何跟踪对象。我想我被可能的误报困惑了。
有人可以解释如果我使用将expired_on_commit
设置为默认True
的scoped_session执行此操作会发生什么:
box = session.query(User).filter(Box.box_id==3, Box.color==u'red').one()
box.color = u'blue'
session.commit() # 1
box.color = u'yellow'
session.commit() # 2
第一次提交(#1)后,session
是否仍在跟踪box
? box
现已过期吗?它脱离了吗?
如果是这样,为什么第二次提交仍会将我的更改推送到数据库?为什么这样做会超过400次,然后一次,跳过一个节拍(通过默默地不推动它们)。
答案 0 :(得分:1)
尚未从会话中添加或已清除已分离的实例。它们不会被commit
保留,也可能无法加载延迟,过期或相关字段。
过期的实例是会话的一部分,但已被标记为需要刷新其字段和关系。访问属性将执行另一个查询以获取最新值。更改将保留在commit
。