SQLAlchemy 事件接口

4 投票
1 回答
1208 浏览
提问于 2025-04-17 01:09

我正在使用 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()的方法。

如果你想监听特定类属性的变化,可以考虑使用属性事件

撰写回答