PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

L'esecuzione di più istruzioni con Postgresql tramite SQLAlchemy non rende persistenti le modifiche

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.