在sqlalchemy中强制对象为“脏”

时间:2015-04-23 17:14:41

标签: python sqlalchemy

有没有办法强制将sqlalchemy映射的对象视为dirty?例如,鉴于sqlalchemy Object Relational Tutorial的上下文,证明了问题,

a=session.query(User).first()
a.__dict__['name']='eh'
session.dirty

屈服,

IdentitySet([])

我正在寻找一种强制用户a进入脏状态的方法。

出现这个问题是因为使用sqlalchemy映射的类控制了属性getter / setter方法,这阻止了sqlalchemy注册更改。

2 个答案:

答案 0 :(得分:18)

我最近遇到了同样的问题而且并不明显。

对象本身并不脏,但它们的属性是。正如我所知,SQLAlchemy只会回写已更改的属性,而不是整个对象。

如果使用set_attribute设置属性并且它与原始属性数据不同,则SQLAlchemy会发现该对象是脏的(TODO:我需要详细说明它是如何进行比较的):

   from sqlalchemy.orm.attributes import set_attribute
   set_attribute(obj, data_field_name, data)

如果您想要将对象标记为脏,而不管原始属性值是什么,无论它是否已更改,请使用flag_modified

   from sqlalchemy.orm.attributes import flag_modified
   flag_modified(obj, data_field_name)

答案 1 :(得分:5)

如果知道该属性存在值,则flag_modified方法有效。 SQLAlchemy文档states

  

将实例上的属性标记为“已修改”。

     

这会在实例上设置'modified'标志并建立一个   给定属性的无条件更改事件。属性必须   有一个值存在,否则会引发InvalidRequestError。

从版本1.2开始,如果想要标记整个实例,那么flag_dirty就是solution

  

将实例标记为“脏”而没有提及任何特定属性。