SQLAlchemy 事件接口
我正在使用 SQLAlchemy 0.7。我想在 session.flush()
之后进行一些“后处理”,具体来说,我需要访问参与 flush()
的实例,并对它们进行遍历。调用 flush() 会更新数据库,但这些实例还会在 LDAP 数据库中存储一些数据,我希望 SQLAlchemy 能通过调用实例方法来触发对 LDAP 数据库的更新。
我想我可以使用 after_flush(session, flush_context)
这个事件,详细信息可以在这里找到,但我该如何获取被 update()
的实例列表呢?
另外,我该如何判断一个实例的哪些列发生了变化(或者说是“脏”了)。我能找到一个实例整体是否脏,但却无法找到单独属性的变化情况。
1 个回答
4
根据你提供的链接:
请注意,当前会话的状态仍然处于“预刷新”状态,也就是说,‘新建’、‘脏’和‘已删除’的列表仍然显示的是预刷新状态,以及实例属性的历史设置。
这意味着你应该能够访问到所有在session.dirty
列表中的脏
对象。你会发现,事件回调的第一个参数是当前的session
对象。
至于第二部分,你可以使用sqlalchemy.orm.attributes.get_history函数来找出哪些列被修改过。这个函数会返回一个历史对象,针对某个属性,它里面有一个has_changes()
的方法。
如果你想监听特定类属性的变化,可以考虑使用属性事件。