【发布时间】:2014-04-16 03:14:39
【问题描述】:
发出session.commit() 后更新对象是否正常工作?还是我需要刷新对象?
我认为这对这个问题来说已经足够了,但如果需要,我可能会提供更多信息来解决我的问题。
编辑:
通过更新,我的意思是设置一些属性,即对象的列值。
【问题讨论】:
标签: sqlalchemy
发出session.commit() 后更新对象是否正常工作?还是我需要刷新对象?
我认为这对这个问题来说已经足够了,但如果需要,我可能会提供更多信息来解决我的问题。
编辑:
通过更新,我的意思是设置一些属性,即对象的列值。
【问题讨论】:
标签: sqlalchemy
简短回答:不,您不需要手动刷新,sqlalchemy 会为您完成。
知道它何时发生是很有用的,所以下面是简短的概述。
来自Session.commit()的文档:
默认情况下,Session 也会过期所有数据库加载状态 事务提交后的 ORM 管理属性。这使得 后续操作从数据库加载最新数据。 可以使用 expire_on_commit=False 选项禁用此行为 到 sessionmaker 或 Session 构造函数。
基本上,如果您没有设置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 语句。
【讨论】:
my_obj.field1 = 'new value') 中的那一行之后,只有在内存中才会发生这种变化。为了让您的数据库反映此更改,您必须再次致电session.commmit()。这包括它吗?
session.commit() 之后设置一个属性仍然使用该新属性更新数据库,即使我没有在之后运行session.commit()。因此,即使在更高版本的更新方面,似乎也可能有所改变?