SQLAlchemy Bidirektionaler Beziehungsverknüpfungs-Proxy

8

Aktualisierung:

Für jeden, der dieses Problem hat, wurde dieses Verhalten mit der neuesten SQLAlchemy behoben.

>

Ursprüngliches Problem:

Ich habe ein Problem damit, dass Verbindungsproxies korrekt aktualisiert werden.

Verwenden Sie die Beispielmodelle hier: Ссылка

Aber ändern UserKeyword mit dieser Zeile:

%Vor%

und Hinzufügen zu Keyword:

%Vor%

So hat eine Keyword-Instanz eine Liste von Benutzern.

Folgendes funktioniert wie erwartet:

%Vor%

Aber Umzüge machen seltsame Dinge. Entfernen Sie aus den Assoziations-Proxy-Listen wie folgt:

%Vor%

Bewirkt einen Integritätsfehler, da SA versucht, eine der Fremdschlüsselspalten auf null zu setzen.

Tun Sie dies:

%Vor%

Ergebnisse in diesem:

%Vor%

Ich habe etwas offensichtlich übersehen, nicht wahr?

    
Rory Hart 23.01.2013, 00:47
quelle

1 Antwort

7

UserKeyword erfordert, dass es sowohl mit einem Keyword als auch mit User gleichzeitig verknüpft ist, um persistiert zu werden. Wenn Sie es mit User und Keyword verknüpfen, aber dann aus der Sammlung User.user_keywords entfernen, ist es immer noch mit Keyword verknüpft.

%Vor%

Wenn wir also jetzt flush () ausgeben würden, hätten Sie ein UserKeyword -Objekt bereit, aber es hat kein User , daher erhalten Sie den NULL-Fehler. Bei der INSERT-Zeit wird das Objekt nicht als "Waisenkind" betrachtet, es sei denn, es ist nicht mit% Keyword.user_keywords oder User.user_keywords Sammlungen verbunden. Nur wenn Sie sagen würden, del chicken.user_keywords[0] oder gleichwertig, würden Sie sehen, dass kein INSERT generiert wird und das UserKeyword -Objekt vergessen wird.

Wenn Sie das Objekt vor dem Entfernen aus der "Rory" in die Datenbank schreiben, ändern sich die Dinge. Das UserKeyword ist jetzt persistent, und wenn Sie "chicken" aus "rory.keywords" entfernen, löst ein "delete-orphan" -Ereignis aus, welches das UserKeyword löscht, obwohl es immer noch aktiv ist ist mit dem Objekt Keyword verknüpft:

%Vor%

Sie sehen das SQL:

%Vor%

Nun würde eine vernünftige Person fragen: "Ist das nicht inkonsequent?" Und im Moment würde ich "absolut" sagen. Ich muss in die Testfälle schauen, um zu sehen, was die Gründe für diesen Unterschied im Verhalten sind. Ich habe im Code herausgefunden, warum es auf diese Weise geschieht, und ich bin mir ziemlich sicher, dass dieser Unterschied darin besteht, wie ein "Waisenkind" betrachtet wird "Pending" versus "Persistent" Objekte sind absichtlich, aber in dieser speziellen Permutation ergibt sich offensichtlich ein seltsames Ergebnis. Ich könnte eine Änderung in 0.8 dafür machen, wenn ich einen finden kann, der machbar ist.

edit: Ссылка fasst das Thema zusammen, worüber ich nachdenken muss. Es gibt einen Test für dieses Verhalten speziell, muss das zurück zu seinem Ursprung verfolgen.

    
zzzeek 23.01.2013, 01:45
quelle

Tags und Links