2012-04-12 16 views
2

私は1つのアイテムをカスケードすると、削除された子の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

答えて

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に接続されている例をあげながら、それはあなたがこのように、必要なものだ場合、あなたはそれだけでDELETEに添付することができます。

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

完全な開示:私は、ウィスコンシン州の裁判所のためにこれを書きました私はPostgreSQLコミュニティと共有することができました。

関連する問題