在提交之前获取已更改和尚未刷新的对象的列表"钩

时间:2015-02-05 09:34:25

标签: python sqlalchemy pyramid zope zodb

上下文:Pyramid,与ZopeTransactionExtension的SQLAlchemy会话,Pyramid事务管理器。

此文档(http://zodb.readthedocs.org/en/latest/transactions.html#more-features-and-things-to-keep-in-mind-about-transactions)说:

提前挂钩

在某些情况下,可能需要在提交事务之前执行某些代码。例如,如果需要对事务期间更改的所有对象执行操作,则最好在提交时调用一次,而不是每次更改对象时都会这样做,这可能会减慢速度。

我需要做到这一点(获取已更改对象的列表,无论是否刷新),但问题是可以由current_transaction.addBeforeCommitHook()添加的钩子函数似乎只接收程序员传递的args和kwargs :不是已更改对象的列表,而不是事务等。

问:如何在刷新当前事务之前更改钩子访问对象

2 个答案:

答案 0 :(得分:0)

我制定了解决方案,虽然不在“提交前”挂钩,而是继承自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

答案 1 :(得分:0)

也许您可以使用get_current_request

访问session.dirty