我使用的是sqlalchemy 0.7。我希望在asession.flush()之后发生一些“后处理”,也就是说,我需要访问flush()中涉及的实例并遍历它们。flush()调用将更新数据库,但所涉及的实例也将一些数据存储在LDAP数据库中,我希望sqlalchemy通过调用实例方法触发对该LDAP数据库的更新。
我想我会使用after_flush(session, flush_context)事件,详细的here,但是如何获得update()'d实例的列表?
另一方面,如何确定实例中哪些列已更改(或“脏”)。我已经能够找出一个实例作为一个整体是否脏,但不是单个属性。

最佳答案

根据link you provided
请注意,会话的状态仍处于预刷新状态,即“new”、“dirty”和“deleted”列表仍显示预刷新状态以及实例属性的历史记录设置。
这意味着您应该能够访问dirty列表中的所有session.dirty对象。您会注意到事件回调的第一个参数是当前session对象。
至于第二部分,您可以使用sqlalchemy.orm.attributes.get_history函数来确定哪些列已经更改。它为包含has_changes()方法的给定属性返回History对象。
如果您试图监听特定类属性的更改,请考虑改用Attribute Events

10-02 08:17
查看更多