gpt4 book ai didi

Python/SQLAlchemy : Event Listeners after_flush fires for decimal values, 即使值没有改变

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:22 24 4
gpt4 key购买 nike

这是我的方法:

def member_field_change_after_flush(session, flush_context):
"""
Keep track of MemberField objects changing per-session.
"""
member_fields = field_changes[session]
session_member_fields = filter(
lambda model: isinstance(model, MemberField),
session.new | session.dirty | session.deleted
)

for member_field in session_member_fields:
for mapper_property in object_mapper(member_field).iterate_properties:
if isinstance(mapper_property, ColumnProperty):
attribute_state = inspect(member_field).attrs.get(mapper_property.key)
history = attribute_state.history
if history.has_changes():
member_fields[member_field.field_id] = {
'member_id': member_field.member_id,
'old_value': history.deleted[0] if history.deleted else None,
'new_value': attribute_state.value,
'field_type': member_field.field.ref_field_type.column_key,
'account_id': member_field.account_id,
}

如果我更改数据库中的值 100.2100.2 , SQLAlchemy认为值实际上已更改并登录 history.deleted[0] dict 中的属性如上所述。

我对Python相当陌生,所以我不确定如何解决这个问题。

最佳答案

每当值发生更改时,您的事件就会被触发。但是,要检查值是否实际更改,您需要调用 session.is_modified(...)

示例:

for obj in session.dirty:
# Here, the field might have been set to the same value
if session.is_modified(obj):
# Here, the fields value has actually changed

我猜这样实现的原因是优化。 docs say something similar :

is_modified(instance, include_collections=True, passive=True)

It is in effect a more expensive and accurate version of checking for the given instance in the Session.dirty collection; a full test for each attribute’s net “dirty” status is performed.

关于Python/SQLAlchemy : Event Listeners after_flush fires for decimal values, 即使值没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23665028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com