SQLAlchemy-Viele-zu-Viele-Orphan-Löschung

8

Ich versuche SQLAlchemy zu verwenden, um ein grundlegendes Benutzergruppenmodell zu implementieren, in dem Benutzer mehrere Gruppen und Gruppen haben können, die mehrere Benutzer haben können.

Wenn eine Gruppe leer wird, möchte ich, dass die Gruppe gelöscht wird (zusammen mit anderen Dingen, die mit der Gruppe verknüpft sind. Glücklicherweise funktioniert die Kaskade von SQLAlchemy in diesen einfacheren Situationen).

Das Problem ist, dass cascade = 'all, delete-orphan' nicht genau das tut, was ich will; Anstatt die Gruppe zu löschen, wenn die Gruppe leer ist, löscht sie die Gruppe, wenn irgendein Mitglied die Gruppe verlässt.

Das Hinzufügen von Triggern zur Datenbank funktioniert gut, um eine Gruppe zu löschen, wenn sie leer ist, mit der Ausnahme, dass Trigger die SQL2Chemic-Kaskadenverarbeitung zu umgehen scheinen, damit Dinge, die mit der Gruppe verknüpft sind, nicht gelöscht werden.

Was ist der beste Weg, um eine Gruppe zu löschen, wenn alle ihre Mitglieder verlassen und diese Löschung Kaskade zu verwandten Entitäten haben.

Ich verstehe, dass ich dies manuell tun könnte, indem ich jeden Platz in meinem Code finde, wo ein Benutzer eine Gruppe verlassen kann und dann dasselbe tut wie der Auslöser, aber ich fürchte, dass ich Orte im Code vermissen würde (und Ich bin faul).

    
Jack Edmonds 11.04.2009, 19:07
quelle

4 Antworten

3

Die Art, wie ich das im Allgemeinen gehandhabt habe, ist eine Funktion für Ihren Benutzer oder Ihre Gruppe namens leave_group. Wenn Sie möchten, dass ein Benutzer eine Gruppe verlässt, rufen Sie diese Funktion auf, und Sie können dort alle gewünschten Nebenwirkungen hinzufügen. Auf lange Sicht wird es dadurch leichter, mehr und mehr Nebenwirkungen hinzuzufügen. (Zum Beispiel, wenn Sie überprüfen möchten, dass jemand eine Gruppe verlassen darf).

    
Singletoned 18.04.2009, 10:29
quelle
3

Ich denke du willst cascade='save, update, merge, expunge, refresh, delete-orphan' . Dies verhindert die "delete" -Kaskade (die du von "all" bekommst), aber halte das "delete-orphan", was du suchst, denke ich (lösche, wenn es keine Eltern mehr gibt).

>     
Rick Copeland 20.04.2009 22:00
quelle
2

Ich hatte das gleiche Problem vor etwa drei Monaten, ich habe eine Post / Tags-Beziehung und wollte nicht verwendete Tags löschen. Ich fragte nach IRC und der Autor von SA sagte mir, dass Kaskaden auf Viele-zu-Viele Beziehungen nicht unterstützt werden, was irgendwie Sinn macht, da es kein "Elternteil" in Vielen-zu-Vielen gibt.

Aber die Erweiterung von SA ist einfach, Sie können wahrscheinlich eine AttributeExtension verwenden, um zu prüfen, ob Die Gruppe wurde leer, wenn sie von einem Benutzer entfernt und von dort gelöscht wird.

    
Jochen Ritzel 29.04.2009 18:15
quelle
0

Können Sie ein Beispiel für die Einrichtung Ihrer Tabelle und Ihres Mappers posten? Es ist vielleicht einfacher zu erkennen, was vor sich geht.

Ohne den Code zu sehen, ist es schwer zu sagen, aber vielleicht stimmt etwas nicht mit der Richtung der Beziehung?

    
Stephen Emslie 22.04.2009 08:48
quelle

Tags und Links