Определите, есть ли в модели SQLAlchemy ожидающие операции записи, связанные с ней - PullRequest
0 голосов
/ 31 января 2019

У меня есть приложение, в котором я выполняю запрос к базе данных SQL и в результате получаю объект SQL Alchemy, представляющий данную строку.Затем, основываясь на пользовательском вводе и серии операторов if / then, я могу выполнить обновление объекта SQLA.

, т. Е.

if 'fooinput1' in payload:
   sqla_instance.foo1 = validate_foo1(fooinput1)
if 'fooinput2' in payload:
   sqla_instance.foo2 = validate_foo2(fooinput2)
...

Теперь мне нужно добавить modified_at иmodified_by данные для этой системы.Можно ли проверить что-то в экземпляре SQLA, например sqla_instance.was_modified или sqla_instance.update_pending, чтобы определить, было ли выполнено изменение?

(я понимаю, что могу поддерживать свой собственный логический was_modified, но посколькумногие из этих предложений if / then, которые привели бы к большому количеству шаблонов, которых я хотел бы избежать, если это возможно.)


FWIW: это приложение Python 2.7, читающее пирамиды из базы данных MySQL вконтекст веб-запроса.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

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

0 голосов
/ 01 февраля 2019

В зависимости от количества полей, модификации которых вы хотите отслеживать, вы можете достичь того, что вам нужно, используя ORM Events :

@sa.event.listens_for(Thing.foo, 'set')
def foo_changed(target, value, oldvalue, initiator):
    target.last_modified = datetime.now()

@sa.event.listens_for(Thing.baz, 'set')
def baz_changed(target, value, oldvalue, initiator):
    target.last_modified = datetime.now()
0 голосов
/ 31 января 2019

Объект Session SQL Alchemy ORM предоставляет два атрибута, которые могут помочь с тем, что вы пытаетесь сделать:

1) Session.is_modified ()

2) Session.dirty

...