Der Code, den Sie oben sehen, ist nur ein Beispiel, aber es funktioniert, um diesen Fehler zu reproduzieren:
%Vor% Eine zugeordnete Instanz wird weiterhin zu einer Sitzung hinzugefügt. Die Instanz möchte wissen (was bedeutet, Abfrage in der Datenbank), wenn andere Instanzen einen eigenen Typ mit den gleichen Werten hat. Es gibt ein zweites Attribut / Spalte ( _nn
). Es ist auf NOT NULL
festgelegt. Aber standardmäßig ist es NULL
.
Wenn die Instanz (wie im Beispiel) immer noch zu der Sitzung hinzugefügt wird, ruft ein Aufruf von query.one()
einen automatischen Flush auf. Dieser Flush erstellt ein INSERT
, das versucht, die Instanz zu speichern. Dies schlägt fehl, weil _nn
immernoch null ist und die NOT NULL
Einschränkung verletzt.
Das verstehe ich derzeit. Aber die Frage ist, warum ruft es einen Auto-Flush auf? Kann ich das blockieren?
%Vor% Natürlich wäre eine Lösung, nicht die Instanz der Sitzung hinzuzufügen, bevor query.one()
aufgerufen wurde. Diese Arbeit. Aber in meinem realen (aber für diese Frage komplexen) Anwendungsfall ist es keine schöne Lösung.
So schalten Sie autoflush aus Funktion:
Temporär: Sie können verwenden no_autoflush Kontextmanager in Snippet, wo Sie die Datenbank abfragen, zB in X.test
method:
Sitzungsweit: Übergeben Sie einfach autoflush=False
an Ihren Sessionmaker:
Tags und Links sql python-3.x sqlalchemy