在 sqlalchemy 中强制对象为“脏”
force object to be `dirty` in sqlalchemy
有没有办法强制考虑由 sqlalchemy 映射的对象 dirty
?例如,给定 sqlalchemy 的 Object Relational Tutorial 问题的上下文,
a=session.query(User).first()
a.__dict__['name']='eh'
session.dirty
屈服,
IdentitySet([])
我正在寻找一种方法来强制用户 a
进入脏状态。
出现此问题是因为使用 sqlalchemy 映射的 class 控制了属性 getter/setter 方法,这阻止了 sqlalchemy 注册更改。
我最近也遇到了同样的问题,不是很明显。
对象本身并不脏,但它们的属性才是。据我所知,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)
如果知道属性有值,flag_modified
方法就会起作用。 SQLAlchemy 文档 states:
Mark an attribute on an instance as ‘modified’.
This sets the ‘modified’ flag on the instance and establishes an
unconditional change event for the given attribute. The attribute must
have a value present, else an InvalidRequestError is raised.
从1.2版本开始,如果要标记整个实例那么flag_dirty
就是solution:
Mark an instance as ‘dirty’ without any specific attribute mentioned.
有没有办法强制考虑由 sqlalchemy 映射的对象 dirty
?例如,给定 sqlalchemy 的 Object Relational Tutorial 问题的上下文,
a=session.query(User).first()
a.__dict__['name']='eh'
session.dirty
屈服,
IdentitySet([])
我正在寻找一种方法来强制用户 a
进入脏状态。
出现此问题是因为使用 sqlalchemy 映射的 class 控制了属性 getter/setter 方法,这阻止了 sqlalchemy 注册更改。
我最近也遇到了同样的问题,不是很明显。
对象本身并不脏,但它们的属性才是。据我所知,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)
如果知道属性有值,flag_modified
方法就会起作用。 SQLAlchemy 文档 states:
Mark an attribute on an instance as ‘modified’.
This sets the ‘modified’ flag on the instance and establishes an unconditional change event for the given attribute. The attribute must have a value present, else an InvalidRequestError is raised.
从1.2版本开始,如果要标记整个实例那么flag_dirty
就是solution:
Mark an instance as ‘dirty’ without any specific attribute mentioned.