2014-10-16 25 views
0

我不确定我是否理解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 

session还是第一次提交(#1)后跟踪boxbox现在是否过期?它是否分离?

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

+0

没有办法回答你最后的问题,因为你没有提供代码来重现问题。请[编辑]包含一个最小的可运行问题示例。 – davidism 2014-10-16 23:02:07

回答

1

分离的实例尚未从会话中添加或已被清除。它们不会被commit持续存在,并且可能无法加载延期,过期或相关字段。

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

相关问题