Warum ruft eine Abfrage ein Auto-Flush in SQLAlchemy auf?

8

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.

    
buhtz 03.10.2015, 11:50
quelle

1 Antwort

15

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:

    %Vor%
  • Sitzungsweit: Übergeben Sie einfach autoflush=False an Ihren Sessionmaker:

    %Vor%
Palasaty 18.02.2016, 09:33
quelle

Tags und Links