PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Das Ausführen mehrerer Anweisungen mit Postgresql über SQLAlchemy behält keine Änderungen bei

Das Autocommit von SQLAlchemy funktioniert so, dass es die ausgegebenen Anweisungen untersucht und versucht festzustellen, ob Daten geändert wurden oder nicht:

... implementiert SQLAlchemy eine eigene „Autocommit“-Funktion, die über alle Backends hinweg vollständig konsistent funktioniert. Dies wird erreicht, indem Anweisungen erkannt werden, die Datenänderungsoperationen darstellen, d. h. INSERT, UPDATE, DELETE, sowie Anweisungen der Datendefinitionssprache (DDL) wie CREATE TABLE, ALTER TABLE, und dann automatisch ein COMMIT ausgeben, wenn keine Transaktion im Gange ist . Die Erkennung basiert auf dem Vorhandensein von autocommit=True Ausführungsoption auf der Anweisung. Wenn die Anweisung eine Nur-Text-Anweisung ist und das Flag nicht gesetzt ist, wird ein regulärer Ausdruck verwendet, um INSERT, UPDATE, DELETE sowie eine Vielzahl anderer Befehle für ein bestimmtes Backend zu erkennen

Da mehrere Ergebnismengen auf SQLAlchemy-Ebene nicht unterstützt werden, lässt die Erkennung in Ihrem ersten Beispiel einfach das Ausgeben eines COMMIT aus, da first -Anweisung ist ein SELECT, wobei es sich wie in Ihrem zweiten Beispiel um ein UPDATE handelt. Es findet kein Versuch statt, Daten ändernde Anweisungen aus mehreren Anweisungen zu erkennen.

Wenn Sie sich PGExecutionContext.should_autocommit_text() ansehen , werden Sie sehen, dass es eine Regex-Übereinstimmung mit AUTOCOMMIT_REGEXP durchführt . Mit anderen Worten, es passt nur am Anfang des Textes.