Meine SQLAlchemy-Anwendung (die über MariaDB läuft) enthält zwei Modelle MyModelA
und MyModelB
, wobei Letzteres ein Kind-Datensatz des ersten ist:
Dies sind die Instanzen von MyModelA
und MyModelB
, die ich erstelle:
Ich habe den folgenden Code, der die Instanz von MyModelA
wo a_id==1
löscht:
Wenn ich diesen Code ausführe, schaue auf die unerwarteten Ergebnisse, die ich bekomme:
%Vor%Das Löschen schlägt angeblich fehl, und die Datenbank gibt eine Ausnahme aus, die ein Rollback verursacht. Aber auch nach dem Rollback zeigt die Anzahl der Zeilen in der Tabelle an, dass die Zeile - die angeblich nicht gelöscht wurde - tatsächlich weg ist !!!
Warum passiert das? Wie kann ich das beheben? Es scheint wie ein Fehler in SQLAlchemy.
TL; DR Ihr Problem könnte mit dem Fehlen einer expliziten Beziehungserklärung zusammenhängen.
Zum Beispiel hier gibt es eine Auswahl von Objekten ' Beziehung. Zusätzlich zur Verwendung eines ForeignKey-Felds verwendet die Klasse explizit die Direktive relationship
, um diese Verbindung zu definieren. In der Sitzungs-API-Dokumentation wird der folgende Text angezeigt:
Objektreferenzen sollten auf der Objektebene und nicht auf der Fremdschlüsselebene
erstellt werden
Was den Weg von SQLAlchemy zur Verwaltung von Beziehungen implizieren könnte. Ich bin mit den zugrunde liegenden Mechanismen nicht sehr vertraut, aber es ist möglich, dass dies passiert. Ihre Sitzung enthält nur das Objekt MyModelA
. Da Sie die relationship()
-Direktive nicht in der Definition von MyModelB
verwendet haben, sind Objekte von MyModelA
type nicht der Tatsache bewusst, dass ein anderes Objekt sie möglicherweise über ein ForeignKey
verweist. Wenn also die Sitzung festgeschrieben wird, ist ihr nicht bewusst, dass das Löschen des Objekts Auswirkungen auf ein anderes MyModelB
-Objekt hat, und sein Transaktionsmechanismus berücksichtigt dies nicht.
Ich schlage vor, dass das Hinzufügen der Beziehung dieses Verhalten möglicherweise verhindert.
Tags und Links python mysql rollback sqlalchemy flask-sqlalchemy