Fehler in SQLAlchemy Rollback nach DB-Ausnahme?

8

Meine SQLAlchemy-Anwendung (die über MariaDB läuft) enthält zwei Modelle MyModelA und MyModelB , wobei Letzteres ein Kind-Datensatz des ersten ist:

%Vor%

Dies sind die Instanzen von MyModelA und MyModelB , die ich erstelle:

%Vor%

Ich habe den folgenden Code, der die Instanz von MyModelA wo a_id==1 löscht:

%Vor%

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.

    
Saqib Ali 18.11.2016, 16:00
quelle

1 Antwort

0

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.

    
Mike 27.11.2016 10:01
quelle