De manier waarop de autocommit van SQLAlchemy werkt, is dat het de uitgegeven instructies inspecteert en probeert te detecteren of gegevens al dan niet zijn gewijzigd:
... implementeert SQLAlchemy zijn eigen "autocommit"-functie die volledig consistent werkt in alle backends. Dit wordt bereikt door verklaringen te detecteren die gegevensveranderende bewerkingen vertegenwoordigen, d.w.z. INSERT, UPDATE, DELETE, evenals DDL-instructies (Data Definition Language) zoals CREATE TABLE, ALTER TABLE, en vervolgens automatisch een COMMIT uit te geven als er geen transactie aan de gang is . De detectie is gebaseerd op de aanwezigheid van de
autocommit=True
uitvoeringsoptie op de verklaring. Als de instructie een instructie met alleen tekst is en de vlag niet is ingesteld, wordt een reguliere expressie gebruikt om INSERT, UPDATE, DELETE en een aantal andere opdrachten voor een bepaalde backend te detecteren
Aangezien meerdere resultaatsets niet worden ondersteund op SQLAlchemy-niveau, laat de detectie in uw eerste voorbeeld eenvoudigweg het geven van een COMMIT weg omdat de eerste statement is een SELECT, terwijl het, zoals in uw tweede voorbeeld, een UPDATE is. Er vindt geen poging plaats om gegevens te detecteren die verklaringen van meerdere verklaringen wijzigen.
Als je kijkt naar PGExecutionContext.should_autocommit_text()
, zult u zien dat het een regex-overeenkomst doet met AUTOCOMMIT_REGEXP
. Met andere woorden, het komt alleen overeen met het begin van de tekst.