4
更新发布后的对象session.commit()
工作正常吗?或者我需要刷新对象?在SQLAlchemy中的session.commit()后更新对象
我认为这个问题已经足够了,但如果需要的话,我可以提供更多的信息来清除我的问题。
编辑:
通过更新,我的意思是设定对象的某些属性,即列值。
更新发布后的对象session.commit()
工作正常吗?或者我需要刷新对象?在SQLAlchemy中的session.commit()后更新对象
我认为这个问题已经足够了,但如果需要的话,我可以提供更多的信息来清除我的问题。
编辑:
通过更新,我的意思是设定对象的某些属性,即列值。
简短回答:不,你不需要手动刷新,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
语句持续性实例属性。
我想你误会了我?我在询问**更新**一个对象,即更新一个/某些列值。请您澄清一下,因为我认为我对“更新”一词的选择可能会产生误导。 – giga
好吧,我的答案涵盖的内容并不相同,但其中很大一部分仍然相关。所以,基本上,在我的答案('my_obj.field1 ='new value')的行后面,只有在内存中才会发生这种变化。为了让你的数据库反映这种变化,你将不得不再次调用'session.commmit()'。这是否覆盖它? – van
是的,非常感谢。 – giga