SQLAlchemy中分离对象和过期对象之间的区别是什么?

时间:2014-10-16 22:50:39

标签: python session sqlalchemy

我不确定我是否理解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是否仍在跟踪boxbox现已过期吗?它脱离了吗?

如果是这样,为什么第二次提交仍会将我的更改推送到数据库?为什么这样做会超过400次,然后一次,跳过一个节拍(通过默默地不推动它们)。

1 个答案:

答案 0 :(得分:1)

尚未从会话中添加或已清除已分离的实例。它们不会被commit保留,也可能无法加载延迟,过期或相关字段。

过期的实例是会话的一部分,但已被标记为需要刷新其字段和关系。访问属性将执行另一个查询以获取最新值。更改将保留在commit