Как я могу получить предыдущее состояние объекта SQLAlchemy ORM после обновления db?

Проблема в том, что я не могу понять, как использовать SQLAlchemy, чтобы уведомить меня, когда объект переходит в новое состояние.

Я использую SQLAlchemy ORM (Declarative) для обновления объекта:

class Customer(declarative_base()): __table_name__ = "customer" id = Column(Integer, primary_key=True) status = Column(String) 

Я хочу знать, когда объект входит в состояние. В частности, после того, как было выпущено ОБНОВЛЕНИЕ и когда государство изменилось. Например Customer.status == 'registered' и ранее он имел другое состояние.

В настоящее время я делаю это с событием атрибута '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», и я проверяю, отличаются ли value и value oldvalue . Проблема в том, что target параметр не полностью сформирован, поэтому он еще не имеет всех значений атрибутов.

Есть лучший способ сделать это? Благодаря!

2 Solutions collect form web for “Как я могу получить предыдущее состояние объекта SQLAlchemy ORM после обновления db?”

Моим решением было использовать «after_flush» SessionEvent вместо «set» AttributeEvent.

Большое спасибо агрохолму, который предоставил этот пример кода 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_, value, 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) 

registry представляет собой словарь, ключи которого являются MapperProperty и значениями которых являются обработчики событий. session , event , inspect и object_mapper – все классы и функции object_mapper .

используйте событие before_update или событие before_flush, чтобы перехватить это событие на более поздний момент времени.

  • Легко конвертировать между столбцами SQLAlchemy и типами данных?
  • Обновление объединенной таблицы с помощью SQLAlchemy ORM с помощью session.query
  • flask-admin: Как сделать столбцы только для чтения в соответствии со значением других столбцов?
  • Python (инфраструктура Pyramid) - это сохранение данных между запросами, и я не могу понять, почему
  • Как присоединиться к той же таблице в sqlalchemy
  • SQLAlchemy: множественное наследование с динамической функцией «association_proxy»
  • SQLAlchemy INSERT IGNORE
  • SQLAlchemy - использование 'aliased' в запросе с пользовательским отношением primaryjoin
  •  
    Interesting Posts for Van-Lav

    В python, как захватить stdout из общей библиотеки c ++ в переменную

    Как читать файлы HDF5 в Python

    Общий массив не был правильно использован для многопроцессорности python

    Выполнение скрипта python из java-аргументов

    Почему я не могу сделать дефис в представлении шаблона Django?

    Класс Python, определенный в том же файле, что и другой класс, – как вы получаете доступ к тому, который указан позже в файле?

    Как отслеживать веб-страницы, открытые в веб-браузере с помощью Python?

    KeyError: «plotly_domain» при использовании plotly для создания графика разброса в python

    Получить последний столбец после операции .str.split () в столбце в pandas DataFrame

    Почему дизайнеры Python не могут быть привязаны к определенным определениям?

    Как импортировать cv2 в проект python «Visual Studio 2015»?

    Какой лучший способ расширить анонимный пользователь в Django?

    Создание контрольной суммы MD5 файла

    pdb.set_trace () вызывает замороженные носеты, не попадает в отладчик

    python 3.1 с pydev

    Python - лучший язык программирования в мире.