2012-04-12 86 views
2

當我級聯刪除一個項目時,我想獲取包含已刪除子項的ID的所有已刪除項目id(主鍵)的列表。可能嗎?如何在sqlalchemy中刪除(或標記爲刪除)項目的級聯ID?

我班的樣子:

class Example(Base): 
    __tablename__ = 'example' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('example.id', ondelete='CASCADE'), nullable=True) 
    childrens = relationship('Example', backref=backref('parent', remote_side=[id], cascade="all, delete")) 

和我一樣查詢:

session.query(Example).filter(Example.id == id).delete() 
+0

通過sqlalchemy沒有解決方案在Python級別? – JalilDotMe 2012-04-13 07:08:16

回答

1

唯一真正的解決辦法,我知道的是使用觸發器。有一個通用觸發器來處理這種類型的問題,這個問題已經被提交給PostgreSQL項目作爲9.2的可安裝擴展(預計將在今年夏天發佈)。如果您的python環境支持PostgreSQL LISTEN/NOTIFY功能,那麼您可以下載並在9.1或9.0中使用它。 (我們[威斯康星州的法院系統]已經將它用於兩個月的產品使用)。恐怕,您需要能夠從源代碼構建它,直到版本9.2發佈。如果你還沒有沒有做過,這個頁面的底部應該是一個良好的開端:

http://www.postgresql.org/docs/devel/static/contrib.html

你可以找到源代碼在這裏延伸:

http://git.postgresql.org/gitweb/?p=postgresql.git;a=tree;f=contrib/tcn;h=aa9c5813223a3996e22cabbf064d7243fa474c6c;hb=HEAD

.. ,你可以在這裏目前發現的文檔:

http://www.postgresql.org/docs/devel/static/tcn.html

您需要創建一個觸發器,在您想要通知的每個表上執行此觸發器函數。通過外鍵定義的ON DELETE CASCADE子句,DML是直接還是間接無關緊要。雖然文檔給那裏的功能附加到所有 DML一個例子,你可以將它只是刪除,如果這就是你所需要的,是這樣的:

create trigger example_tcn_trigger 
    after delete on example 
    for each row execute procedure triggered_change_notification(); 

全面披露:我寫這個的威斯康星州法院系統,他們允許我與PostgreSQL社區分享。