您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 如何在db更新后获得SQLAlchemy ORM对象的先前状态?

5b51 2022/1/14 8:20:44 python 字数 4284 阅读 475 来源 www.jb51.cc/python

问题是我无法弄清楚当对象进入新状态时如何使用SQLAlchemy通知我.我正在使用SQLAlchemy ORM(声明性)来更新对象:class Customer(declarative_base()): __table_name__ = 'customer' id = Column(Integer, primary_key=True)

概述

问题是我无法弄清楚当对象进入新状态时如何使用sqlAlchemy通知我.

我正在使用sqlAlchemy ORM(声明性)来更新对象:

class Customer(declarative_base()):

    __table_name__ = "customer"

    id = Column(Integer,primary_key=True)
    status = Column(String)

我想知道一个物体进入状态的时间.特别是在发布UPDATE并且状态发生变化之后.例如. Customer.status ==’已注册’,之前有不同的状态.

我目前正在使用’set’属性事件执行此操作:

from sqlalchemy import event
from model import Customer

def on_set_attribute(target,value,oldvalue,initiator):
    print target.status
    print value
    print oldvalue

event.listen(
        Customer.status,'set',on_set_attribute,propagate=True,active_history=True)

每次在该属性调用’set’时,我的代码都会触发,我检查值和oldvalue是否不同.问题是目标参数没有完全形成,因此它还没有填充所有属性值.

一个更好的方法吗?谢谢!

非常感谢agronholm提供了专门检查对象值和oldvalue的示例SessionEvent代码.

下面的解决方案是对他的代码修改

def get_old_value(attribute_state):
    history = attribute_state.history
    return history.deleted[0] if history.deleted else None


def trigger_attribute_change_events(object_):
    for mapper_property in object_mapper(object_).iterate_properties:
        if isinstance(mapper_property,ColumnProperty):
            key = mapper_property.key
            attribute_state = inspect(object_).attrs.get(key)
            history = attribute_state.history

            if history.has_changes():
                value = attribute_state.value
                # old_value is None for new objects and old value for dirty objects
                old_value = get_old_value(attribute_state)
                handler = registry.get(mapper_property)
                if handler:
                    handler(object_,old_value)


def on_after_flush(session,flush_context):
    changed_objects = session.new.union(session.dirty)
    for o in changed_objects:
        trigger_attribute_change_events(o)

event.listen(session,"after_flush",on_after_flush)

注册表是一个字典,其键是MapperProperty,其值是事件处理程序.
session,event,inspect和object_mapper都是sqlalchemy类和函数.

总结

以上是编程之家为你收集整理的python – 如何在db更新后获得SQLAlchemy ORM对象的先前状态?全部内容,希望文章能够帮你解决python – 如何在db更新后获得SQLAlchemy ORM对象的先前状态?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶