Il modo in cui funziona l'autocommit di SQLAlchemy è che ispeziona le istruzioni emesse, cercando di rilevare se i dati vengono modificati o meno:
..., SQLAlchemy implementa la propria funzione di "autocommit" che funziona in modo completamente coerente su tutti i backend. Ciò si ottiene rilevando istruzioni che rappresentano operazioni di modifica dei dati, ad esempio INSERT, UPDATE, DELETE, nonché istruzioni DDL (Data Definition Language) come CREATE TABLE, ALTER TABLE e quindi emettendo un COMMIT automaticamente se non è in corso alcuna transazione . Il rilevamento si basa sulla presenza del autocommit=True
opzione di esecuzione sull'istruzione. Se l'istruzione è di solo testo e il flag non è impostato, viene utilizzata un'espressione regolare per rilevare INSERT, UPDATE, DELETE, nonché una varietà di altri comandi per un particolare back-end
Poiché più set di risultati non sono supportati a livello di SQLAlchemy, nel tuo primo esempio il rilevamento omette semplicemente di emettere un COMMIT perché il primo è un SELECT, dove come nel tuo secondo esempio è un UPDATE. Non viene eseguito alcun tentativo di rilevare le istruzioni di modifica dei dati da più istruzioni.
Se guardi PGExecutionContext.should_autocommit_text()
, vedrai che esegue una corrispondenza regolare con AUTOCOMMIT_REGEXP
. In altre parole corrisponde solo all'inizio del testo.