2009-04-11 11 views
8

SQLAlchemyを使用して、ユーザーが複数のグループを持ち、グループに複数のユーザーを持つことができる基本ユーザーグループモデルを実装しようとしています。SQLAlchemy多対多孤立削除

グループが空になると、グループを削除したい(グループに関連付けられている他のものと一緒に、幸いSQLAlchemyのカスケードはこれらのより単純な状況でうまくいく)。

問題は、カスケード=「すべて削除 - 孤児は」私が望む正確に何をしないということです。グループが空になったときにグループを削除する代わりに、メンバーがグループを離れるときにグループを削除します。

データベースにトリガを追加すると、トリガがSQLAlchemyのカスケード処理をバイパスしてグループに関連付けられているものが削除されないように見えることを除けば、グループが空になったときに削除できます。

は、そのすべてのメンバーが出て、関連するエンティティにこの削除カスケードを持っているときに、グループを削除するための最良の方法は何ですか。

ユーザーがグループを離れてトリガーと同じことをすることができるコード内のすべての場所を検索することで手動で行うことができると私は理解していますが、私は怠け者です)。

+0

私は、大体何を(あなたは、削除、孤児などを入れた多対多の関係を、設定しているか)あなたのコードについていくつかの詳細なしにこの質問に答えるには少し難しいかもしれないと思いますスキーマなど –

+0

私は、バックリファレンスと通常の関係()でdelete-orphanを試しました。 基本的にはマッパーです(ユーザ、ユーザ、プロパティ= {'groups':relation = relation(グループ、セカンダリ= users_groups、backref = backref( 'users'))}) –

答えて

3

私が一般的にこれを処理した方法は、あなたのユーザーまたはグループにleave_groupという関数を持たせることです。ユーザーがグループから離れるようにするには、その関数を呼び出します。そこに任意の副作用を追加できます。長期的には、これにより、より多くの副作用を加えることが容易になります。 (例えば、誰かがグループを離れることを許可されているかどうかをチェックしたい場合)。

3

私はあなたがほしいと思うと思うcascade='save, update, merge, expunge, refresh, delete-orphan'。これは、 "削除"カスケード(あなたは "すべて"から取得する)を防ぎますが、あなたが探しているものである "削除オーファン"を維持します。

+1

SA 0.6では、孤児のカスケードオプションには「削除」が必要です – ThiefMaster

0

テーブルとマッパーのサンプルを投稿できますか?何が起こっているのかを知る方が簡単かもしれません。

コードを見ることなく、わかりにくいですが、関係の方向に間違いがありますか?

2

私は約3ヶ月前に同じ問題があった、私はポスト/タグの関係を持っていて、未使用のタグを削除したい。私はircとSAの著者に質問しました。多対多関係のカスケードはサポートされていません。多対多に「親」がないので意味があります。

しかし、SAが簡単で拡張、おそらくユーザーから削除されたときにグループが空になったかどうかを確認し、そこからそれを削除するためにAttributeExtensionを使用することができます。