在sqlalchemy中强制对象为“脏”

问题描述 投票:12回答:2

有没有办法强制sqlalchemy映射的对象被认为是dirty?例如,鉴于sqlalchemy的Object Relational Tutorial的背景,证明了问题,

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

高产,

IdentitySet([])

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

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

python sqlalchemy
2个回答
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)

5
投票

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

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

这将在实例上设置“modified”标志,并为给定属性建立无条件更改事件。该属性必须具有值,否则将引发InvalidRequestError。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.