Интерфейс SQLAlchemy Event - PullRequest
       10

Интерфейс SQLAlchemy Event

4 голосов
/ 02 сентября 2011

Я использую SQLAlchemy 0.7.Я хотел бы, чтобы после session.flush() происходила некоторая «постобработка», а именно, мне нужно было получить доступ к экземплярам, ​​включенным в flush(), и пройти через них.Вызов flush () обновит базу данных, но задействованные экземпляры также сохранят некоторые данные в базе данных LDAP, я хотел бы, чтобы SQLAlchemy инициировал обновление этой базы данных LDAP, вызывая метод экземпляра.

Я полагал, что яиспользовать событие after_flush(session, flush_context), подробно здесь , но как мне получить список update()'d экземпляров?

В примечании, как определить, какие столбцы имеютизменено (или «грязно») на экземпляре.Мне удалось выяснить, является ли экземпляр в целом грязным, но не отдельные свойства.

1 Ответ

4 голосов
/ 17 сентября 2011

По предоставленной вами ссылке :

Обратите внимание, что состояние сеанса по-прежнему находится в состоянии предварительной очистки, т. Е. В списках "новый", "грязный" и "удаленный" по-прежнему отображается состояние предварительной очистки, а также параметры истории для атрибутов экземпляра.

Это означает, что вы должны иметь доступ ко всем dirty объектам в списке session.dirty. Вы заметите, что первым параметром обратного вызова события является текущий session объект.

Что касается второй части, вы можете использовать функцию sqlalchemy.orm.attributes.get_history , чтобы выяснить, какие столбцы были изменены. Он возвращает объект History для данного атрибута, который содержит метод has_changes().

Если вы пытаетесь прослушать изменения определенных атрибутов класса, рассмотрите возможность использования События атрибута .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...