【问题标题】:SQLAlchemy Event interfaceSQLAlchemy 事件接口
【发布时间】:2011-09-01 20:07:48
【问题描述】:

我正在使用 SQLAlchemy 0.7。我希望在session.flush() 之后进行一些“后处理”,即我需要访问flush() 中涉及的实例并遍历它们。 flush() 调用将更新数据库,但所涉及的实例还将一些数据存储在 LDAP 数据库中,我希望 SQLAlchemy 通过调用实例方法来触发对该 LDAP 数据库的更新。

我想我会使用after_flush(session, flush_context) 事件,详细的here,但我如何获得update()'d 实例的列表?

附带说明,我如何确定实例上哪些列已更改(或“脏”)。我已经能够找出整个实例是否脏,而不是单个属性。

【问题讨论】:

    标签: python events sqlalchemy


    【解决方案1】:

    根据link you provided

    请注意,会话的状态仍处于预刷新状态,即“新”、“脏”和“已删除”列表仍显示预刷新状态以及实例属性的历史设置。

    这意味着您应该能够访问session.dirty 列表中的所有dirty 对象。您会注意到事件回调的第一个参数是当前的session 对象。

    至于第二部分,您可以使用sqlalchemy.orm.attributes.get_history 函数来确定哪些列已被更改。它为包含has_changes() 方法的给定属性返回一个History 对象。

    如果您尝试侦听特定类属性的更改,请考虑改用Attribute Events

    【讨论】:

    • 我同意。 session.newsession.dirty 将起作用。但是属性事件不会有您要查找的历史记录。如果您有兴趣,我在另一篇文章中包含了一个详细示例:stackoverflow.com/questions/15642286/…
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2014-07-02
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 2016-04-18
    相关资源
    最近更新 更多