Warum spülen, wenn Sie sich verpflichten können?
Als jemand, der neu in der Arbeit mit Datenbanken und SQLalchemie ist, waren mir die vorherigen Antworten, die flush()
SQL-Anweisungen an die Datenbank senden und diese beibehalten, commit()
nicht klar. Die Definitionen sind sinnvoll, aber aus den Definitionen geht nicht sofort hervor, warum Sie einen Flush verwenden würden, anstatt nur einen Commit durchzuführen.
Da ein Commit immer gelöscht wird ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ), klingen diese sehr ähnlich. Ich denke, das große Problem ist, dass ein Flush nicht permanent ist und rückgängig gemacht werden kann, während ein Commit permanent ist, in dem Sinne, dass Sie die Datenbank nicht bitten können, das letzte Commit rückgängig zu machen (glaube ich).
@snapshoe hebt hervor, dass Sie, wenn Sie die Datenbank abfragen und Ergebnisse mit neu hinzugefügten Objekten erhalten möchten, zuerst geleert haben müssen (oder festgeschrieben haben müssen, was für Sie geleert wird). Vielleicht ist dies für einige Leute nützlich, obwohl ich nicht sicher bin, warum Sie lieber spülen als festschreiben möchten (abgesehen von der trivialen Antwort, dass es rückgängig gemacht werden kann).
In einem anderen Beispiel habe ich Dokumente zwischen einer lokalen Datenbank und einem Remote-Server synchronisiert. Wenn der Benutzer den Vorgang abbrechen möchte, sollten alle Hinzufügungen / Aktualisierungen / Löschungen rückgängig gemacht werden (dh keine teilweise Synchronisierung, nur eine vollständige Synchronisierung). Beim Aktualisieren eines einzelnen Dokuments habe ich beschlossen, einfach die alte Zeile zu löschen und die aktualisierte Version vom Remote-Server hinzuzufügen. Es stellt sich heraus, dass aufgrund der Art und Weise, wie sqlalchemy geschrieben ist, die Reihenfolge der Operationen beim Festschreiben nicht garantiert ist. Dies führte dazu, dass eine doppelte Version hinzugefügt wurde (bevor versucht wurde, die alte zu löschen), was dazu führte, dass die Datenbank eine eindeutige Einschränkung nicht erfüllte. Um dies zu umgehen, habe ich verwendet, flush()
damit die Reihenfolge beibehalten wurde, aber ich konnte es trotzdem rückgängig machen, wenn der Synchronisierungsprozess später fehlschlug.
Siehe meinen Beitrag dazu unter: Gibt es eine Reihenfolge für das Hinzufügen oder Löschen beim Festschreiben in sqlalchemy?
In ähnlicher Weise wollte jemand wissen, ob beim Hinzufügen eine Reihenfolge hinzugefügt wird, dh wenn ich hinzufüge und object1
dann hinzufüge object2
, wird object1
sie der Datenbank hinzugefügt, bevor object2
SQLAlchemy die Reihenfolge beim Hinzufügen von Objekten zur Sitzung speichert.
Auch hier würde vermutlich die Verwendung eines Flush () das gewünschte Verhalten sicherstellen. Zusammenfassend lässt sich sagen, dass eine Verwendung für Flush darin besteht, Bestellgarantien bereitzustellen (glaube ich), während Sie sich dennoch eine "Rückgängig" -Option erlauben, die Commit nicht bietet.
Autoflush und Autocommit
Beachten Sie, dass das automatische Löschen verwendet werden kann, um sicherzustellen, dass Abfragen in einer aktualisierten Datenbank ausgeführt werden, da sqlalchemy vor dem Ausführen der Abfrage geleert wird. https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
Autocommit ist etwas anderes, das ich nicht vollständig verstehe, aber es scheint, als würde von seiner Verwendung abgeraten:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params. Autocommit
Speichernutzung
Nun wollte die ursprüngliche Frage eigentlich wissen, wie sich Flush vs. Commit für Speicherzwecke auswirkt. Da die Fähigkeit zum Fortbestehen oder Nichtbestehen etwas ist, was die Datenbank bietet (glaube ich), sollte ein einfaches Leeren ausreichen, um in die Datenbank zu verlagern - obwohl das Festschreiben nicht schaden sollte (was wahrscheinlich hilft - siehe unten), wenn Sie sich nicht um das Rückgängigmachen kümmern .
sqlalchemy verwendet eine schwache Referenzierung für Objekte, die gelöscht wurden: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-behavior
Das heißt, wenn Sie ein Objekt nicht explizit an einem Ort haben, wie in einer Liste oder einem Diktat, wird es von sqlalchemy nicht gespeichert.
Dann müssen Sie sich jedoch um die Datenbankseite kümmern. Vermutlich ist das Löschen ohne Festschreiben mit einer Speicherstrafe verbunden, um die Transaktion aufrechtzuerhalten. Auch hier bin ich neu, aber hier ist ein Link, der genau dies zu suggerieren scheint: https://stackoverflow.com/a/15305650/764365
Mit anderen Worten, Commits sollten die Speichernutzung reduzieren, obwohl hier vermutlich ein Kompromiss zwischen Speicher und Leistung besteht. Mit anderen Worten, Sie möchten wahrscheinlich nicht jede einzelne Datenbankänderung einzeln festschreiben (aus Leistungsgründen), aber zu langes Warten erhöht die Speichernutzung.