【问题标题】:Getting a list of changed and not yet flushed objects in a "before commit" hook在“提交前”挂钩中获取已更改但尚未刷新的对象列表
【发布时间】:2015-04-05 02:28:42
【问题描述】:

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

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

提交前挂钩

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

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

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

【问题讨论】:

    标签: python sqlalchemy pyramid zope zodb


    【解决方案1】:

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

    【讨论】:

    • 对,因为已更改的对象非常特定于事务扩展,但钩子不是;它只知道交易。您可能会向事务询问所有扩展并找到带有 SQLAlchemy 会话的扩展。
    【解决方案2】:

    也许您可以使用get_current_request 访问 session.dirty

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2018-09-29
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多