3

1 つのアイテムをカスケード削除すると、削除された子の ID を含むすべての削除済みアイテム 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()
4

1 に答える 1

1

私が知っている唯一の本当の解決策は、トリガーを使用することです。9.2のインストール可能な拡張機能としてPostgreSQLプロジェクトにコミットされたこのタイプの問題に対処するための一般化されたトリガーがあります(今年の夏にリリースされる予定です)。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

通知が必要な各テーブルでこのトリガー関数を実行するトリガーを作成する必要があります。外部キー定義のONDELETECASCADE句のように、DMLが直接か間接かは関係ありません。ドキュメントには、関数がすべてのDMLにアタッチされている例が示されていますが、必要に応じて、次のようにDELETEにアタッチすることもできます。

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

完全な開示:私はウィスコンシンの法廷システムのためにこれを書きました、そして彼らは私がそれをPostgreSQLコミュニティと共有することを許可しました。

于 2012-04-12T14:25:40.653 に答える