2011-09-01 33 views
4

我正在使用SQLAlchemy 0.7。我想在session.flush()之後發生一些「後處理」,即我需要訪問flush()中涉及的實例並遍歷它們。 flush()調用將更新數據庫,但涉及的實例也將某些數據存儲在LDAP數據庫中,我希望SQLAlchemy通過調用實例方法來觸發對LDAP數據庫的更新。SQLAlchemy事件接口

我想我會使用after_flush(session, flush_context)事件,詳細的here,但我如何獲得update()'d實例的列表?

請注意,如何確定實例上的哪些列已更改(或「髒」)。我已經能夠發現整個實例是否髒,但不是單獨的屬性。

回答

4

按照link you provided

注意,會話的狀態仍然在沖洗前,也就是「新」,「骯髒」和「刪除」列出仍然顯示的沖洗前的狀態,以及實例屬性的歷史設置。

這意味着您應該可以訪問session.dirty列表中的所有dirty對象。您會注意到事件回調的第一個參數是當前的session對象。

至於第二部分,您可以使用sqlalchemy.orm.attributes.get_history函數來確定哪些列已被更改。它爲包含has_changes()方法的給定屬性返回一個History對象。

如果您試圖聽取特定類屬性的更改,請考慮使用Attribute Events來代替。

+0

我同意。 'session.new'和'session.dirty'將會工作。但屬性事件不會有你正在尋找的歷史。我在另一篇文章中包含了一個詳細的例子,如果你感興趣:http://stackoverflow.com/questions/15642286/how-can-i-get-a-sqlalchemy-orm-objects-previous-state-after-a- DB-更新/ 15671586#15671586 –