Ich verwende ein bidirektionales association_proxy
, um die Eigenschaften Group.members
und User.groups
zu assoziieren. Ich habe Probleme mit dem Entfernen eines Mitglieds aus Group.members
. Insbesondere löscht Group.members.remove
erfolgreich einen Eintrag aus Group.members
, , behält aber None
anstelle des entsprechenden Eintrags in User.groups
.
Genauer gesagt, der folgende (minimal-ish) repräsentative Code-Ausschnitt versagt seine letzte Behauptung:
%Vor%Ich habe versucht, die Antworten zu SQLAlchemy Beziehung mit association_proxy zu folgen Probleme und Wie kann SQLAlchemy association_proxy verwendet werden Richtungsweisend? aber sie scheinen nicht zu helfen.
Ich habe Ihr Problem fast ausschließlich zufällig entdeckt, als ich versuchte, herauszufinden, was vor sich geht.
> Weil in der Datenbank keine Daten vorhanden waren, habe ich session.commit()
hinzugefügt. Es stellt sich heraus (aus der verknüpften Antwort):
Die Änderungen werden nicht dauerhaft auf dem Datenträger gespeichert oder für andere Transaktionen sichtbar, bis die Datenbank ein COMMIT für die aktuelle Transaktion erhält (was session.commit () tut).
Da Sie nur die Änderungen in% ändern, fragt sqlalchemy die Datenbank nie erneut ab. Sie können dies überprüfen, indem Sie hinzufügen:
%Vor% Und dann einfach den Code ausführen. Es werden alle Abfragen angezeigt, die ausgeführt werden, sobald sie auftreten. Dann können Sie .flush()
in session.flush()
ändern und dann erneut ausführen, und Sie werden sehen, dass mehrere session.commit()
-Anweisungen nach Ihrem SELECT
ausgeführt werden.
Es sieht so aus, als ob entweder commit
oder session.expire(user)
eine Aktualisierung des Benutzers erzwingen. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, das Update auf das andere Objekt zu übertragen, ohne explizit darauf einzugehen (oder wenn das sogar wünschenswert ist).
Tags und Links python sqlalchemy