2014-03-12 416 views
4

更新发布后的对象session.commit()工作正常吗?或者我需要刷新对象?在SQLAlchemy中的session.commit()后更新对象

我认为这个问题已经足够了,但如果需要的话,我可以提供更多的信息来清除我的问题。

编辑:

通过更新,我的意思是设定对象的某些属性,即列值。

回答

4

简短回答:不,你不需要手动刷新,sqlalchemy会为你做。


知道它何时发生是有用的,所以下面是简短的概述。 从Session.commit()文档:

默认情况下,会议还交易后到期的所有数据库负载状态上的所有 ORM管理属性提交。这样后续操作就会从数据库加载最新的数据。 此行为可以使用sessionmaker或Session构造函数的expire_on_commit = False选项 禁用。

基本上,给你不设置expire_on_commit=False,对象将被自动一旦你尝试session.commit()后访问(读取,未设定)它的属性刷新。

my_obj = session.query(MyType).get(1) 
my_obj.field1 = 'value1' 
session.commit() # will commit and expire my_obj 

my_obj.field1 = 'new value' # object is still the same, but field is updated 
print my_obje.field1 # at this point SA will first refresh the object from the database; and make sure that new values for changed fields are applied 

事实上,如果你启用日志记录,你会发现sqlalchemy只要你访问(读取)发出新SELECT语句持续性实例属性。

+0

我想你误会了我?我在询问**更新**一个对象,即更新一个/某些列值。请您澄清一下,因为我认为我对“更新”一词的选择可能会产生误导。 – giga

+0

好吧,我的答案涵盖的内容并不相同,但其中很大一部分仍然相关。所以,基本上,在我的答案('my_obj.field1 ='new value')的行后面,只有在内存中才会发生这种变化。为了让你的数据库反映这种变化,你将不得不再次调用'session.commmit()'。这是否覆盖它? – van

+0

是的,非常感谢。 – giga