在sqlalchemy中强制对象为"脏"

ale*_*lex 14 python sqlalchemy

有没有办法强制sqlalchemy映射的对象被考虑dirty?例如,给出sqlalchemy的对象关系教程 的上下文,证明了问题,

a=session.query(User).first()
a.__dict__['name']='eh'
session.dirty
Run Code Online (Sandbox Code Playgroud)

高产,

IdentitySet([])
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来强迫用户a进入脏状态.

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

Mik*_*maa 20

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

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

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

   from sqlalchemy.orm.attributes import set_attribute
   set_attribute(obj, data_field_name, data)
Run Code Online (Sandbox Code Playgroud)

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

   from sqlalchemy.orm.attributes import flag_modified
   flag_modified(obj, data_field_name)
Run Code Online (Sandbox Code Playgroud)


blu*_*Cat 5

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

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

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

与1.2版本开始,如果一个人想纪念整个实例则flag_dirty解决方案

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