Python 获取“中已更改和尚未刷新的对象的列表”;“提交前”;钩

Python 获取“中已更改和尚未刷新的对象的列表”;“提交前”;钩,python,sqlalchemy,pyramid,zope,zodb,Python,Sqlalchemy,Pyramid,Zope,Zodb,上下文:金字塔,带ZopeTransactionExtension的SQLAlchemy会话,金字塔事务管理器 这份文件()说: 在提交钩子之前 在某些情况下,可能需要在提交事务之前执行一些代码。例如,如果需要对事务期间更改的所有对象执行操作,则最好在提交时调用一次,而不是每次更改对象时调用一次,这可能会降低速度 我确实需要这样做(获取已更改对象的列表,无论是否刷新),但问题是可以通过current\u事务添加的钩子函数。addBeforeCommitHook()似乎只接收程序员传递的arg和k

上下文:金字塔,带ZopeTransactionExtension的SQLAlchemy会话,金字塔事务管理器

这份文件()说:

在提交钩子之前

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

我确实需要这样做(获取已更改对象的列表,无论是否刷新),但问题是可以通过
current\u事务添加的钩子函数。addBeforeCommitHook()
似乎只接收程序员传递的arg和kwarg:不是已更改对象的列表,也不是事务,等等


问:如何在刷新当前事务中更改钩子访问对象之前获取它们?

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

也许您可以使用

权限访问session.dirty,因为已更改的对象非常特定于事务扩展,但钩子不是;它只知道交易。您可能会要求事务提供所有扩展,并找到具有SQLAlchemy会话的扩展。