Måden SQLAlchemys autocommit fungerer på er, at den inspicerer de udstedte erklæringer og forsøger at opdage, om data er ændret eller ej:
... implementerer SQLAlchemy sin egen "autocommit"-funktion, som fungerer fuldstændig konsekvent på tværs af alle backends. Dette opnås ved at detektere sætninger, der repræsenterer dataændrende operationer, dvs. INSERT, UPDATE, DELETE, samt data definition language (DDL) sætninger såsom CREATE TABLE, ALTER TABLE, og derefter udstede en COMMIT automatisk, hvis ingen transaktion er i gang . Detekteringen er baseret på tilstedeværelsen af autocommit=True
udførelsesmulighed på erklæringen. Hvis sætningen er en tekst-kun-sætning, og flaget ikke er indstillet, bruges et regulært udtryk til at detektere INSERT, UPDATE, DELETE samt en række andre kommandoer for en bestemt backend
Da flere resultatsæt ikke understøttes på SQLAlchemy-niveau, udelader registreringen i dit første eksempel blot at udstede en COMMIT, fordi den første statement er en SELECT, hvor det som i dit andet eksempel er en UPDATE. Intet forsøg på at opdage datamodificerende udsagn fra flere udsagn finder sted.
Hvis du ser på PGExecutionContext.should_autocommit_text()
, vil du se, at den matcher regex mod AUTOCOMMIT_REGEXP
. Med andre ord matcher den kun i begyndelsen af teksten.