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?
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.
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:
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.
Tags und Links python sqlalchemy