Sättet som SQLAlchemys autocommit fungerar är att den inspekterar de utfärdade uttalandena och försöker upptäcka om data är modifierade eller inte:
..., implementerar SQLAlchemy sin egen "autocommit"-funktion som fungerar helt konsekvent över alla backends. Detta uppnås genom att upptäcka uttalanden som representerar dataförändrande operationer, dvs. INSERT, UPDATE, DELETE, såväl som datadefinitionsspråk (DDL)-satser som CREATE TABLE, ALTER TABLE och sedan utfärda en COMMIT automatiskt om ingen transaktion pågår . Detekteringen baseras på förekomsten av
autocommit=True
exekveringsalternativ på uttalandet. Om satsen endast är en textsats och flaggan inte är inställd, används ett reguljärt uttryck för att detektera INSERT, UPDATE, DELETE, samt en mängd andra kommandon för en viss backend
Eftersom flera resultatuppsättningar inte stöds på SQLAlchemy-nivå, i ditt första exempel utelämnar upptäckten helt enkelt en COMMIT eftersom den första uttalande är en SELECT, där det som i ditt andra exempel är en UPPDATERING. Inget försök att upptäcka datamodifierande satser från flera satser görs.
Om du tittar på PGExecutionContext.should_autocommit_text()
, ser du att den matchar regex mot AUTOCOMMIT_REGEXP
. Med andra ord matchar den bara i början av texten.