9

SQLAlchemy を使用して、ユーザーが複数のグループを持つことができ、グループが複数のユーザーを持つことができる基本的なユーザー グループ モデルを実装しようとしています。

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

問題は、 cascade='all, delete-orphan' が私が望んでいることを正確に実行しないことです。グループが空になったときにグループを削除するのではなく、メンバーがグループを離れたときにグループを削除します。

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

グループのすべてのメンバーが脱退し、この削除が関連するエンティティにカスケードされるときにグループを削除する最善の方法は何ですか?

ユーザーがグループを離れることができるコード内のすべての場所を見つけて、トリガーと同じことを行うことで、これを手動で行うことができることを理解していますが、コード内の場所を見逃すのではないかと心配しています (そして私は怠惰)。

4

4 に答える 4

3

欲しいと思いますcascade='save, update, merge, expunge, refresh, delete-orphan'。これにより、「削除」カスケード(「すべて」から取得)が防止されますが、探している「孤立した削除」が維持されます(親がなくなったら削除します)。

于 2009-04-20T22:00:12.727 に答える
3

私が一般的にこれを処理した方法は、ユーザーまたはグループに leave_group と呼ばれる機能を持たせることです。ユーザーをグループから退出させたい場合は、その関数を呼び出し、必要な副作用をそこに追加できます。長期的には、これにより、ますます多くの副作用が追加されやすくなります。(たとえば、誰かがグループを離れることを許可されていることを確認したい場合)。

于 2009-04-18T10:29:31.813 に答える
2

約 3 か月前に同じ問題が発生しました。投稿/タグ関係があり、未使用のタグを削除したかったのです。irc で尋ねたところ、SA の作成者は、多対多の関係でのカスケードはサポートされていないと言いました。多対多には「親」がないため、これは理にかなっています。

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

于 2009-04-29T18:15:16.487 に答える
0

テーブルとマッパーのセットアップのサンプルを投稿できますか? 何が起こっているのかを見つけやすくなるかもしれません。

コードを見ないとわかりにくいのですが、関係の方向に何か問題があるのでしょうか?

于 2009-04-22T08:48:37.403 に答える