Получение списка измененных и еще не очищенных объектов в хуке перед фиксацией

Контекст: Pyramid, сеанс SQLAlchemy с ZopeTransactionExtension, менеджер транзакций Pyramid.

Этот документ (http://zodb.readthedocs.org/en/latest/transactions.html#more-features-and-things-to-keep-in-mind-about-transactions ) говорит:

Перехватчики перед фиксацией

В некоторых случаях желательно выполнить некоторый код непосредственно перед фиксацией транзакции. Например, если операцию необходимо выполнить для всех объектов, измененных во время транзакции, может быть лучше вызывать ее один раз во время фиксации, а не каждый раз при изменении объекта, что может замедлить работу.

Мне нужно сделать именно это (получить список измененных объектов, очищенных или нет), но проблема в том, что функции-ловушки, которые могут быть добавлены с помощью current_transaction.addBeforeCommitHook(), получают только аргументы и kwargs, переданные программистами: не список измененных объектов , не транзакция и т.д.

В: Как сделать так, чтобы объекты доступа к ловушкам изменялись в текущей транзакции до того, как они будут сброшены?


person LetMeSOThat4U    schedule 05.02.2015    source источник


Ответы (2)


Я разработал решение, хотя и не в хуке «до фиксации», а скорее наследуя от ZopeTransactionExtension:

class ZopeTransactionExtensionWithRequest(ZopeTransactionExtension):

    def before_flush(self, session, flush_context, instances):
        super(ZopeTransactionExtensionWithRequest, self).before_flush(session, flush_context, instances)
        for sqa_inst in session.dirty:
            pass
person LetMeSOThat4U    schedule 05.02.2015
comment
Верно, потому что объекты, которые были изменены, очень специфичны для расширения транзакции, а хук — нет; он знает только о транзакции. Вы запросите у транзакции все расширения и, возможно, найдете те, у которых есть сеанс SQLAlchemy. - person Martijn Pieters; 05.02.2015

Возможно, вы можете получить доступ к session.dirty с помощью get_current_request

person Sergei Zherevchuk    schedule 20.02.2015