Sposób, w jaki działa autocommit SQLAlchemy, polega na sprawdzaniu wydanych instrukcji, próbując wykryć, czy dane zostały zmodyfikowane:
..., SQLAlchemy implementuje własną funkcję „autocommit”, która działa całkowicie spójnie we wszystkich backendach. Osiąga się to poprzez wykrywanie instrukcji, które reprezentują operacje zmieniające dane, tj. INSERT, UPDATE, DELETE, a także instrukcji języka definicji danych (DDL), takich jak CREATE TABLE, ALTER TABLE, a następnie automatyczne wydawanie COMMIT, jeśli żadna transakcja nie jest w toku . Wykrywanie opiera się na obecności autocommit=True
opcja wykonania na wyciągu. Jeśli instrukcja jest instrukcją tylko tekstową, a flaga nie jest ustawiona, wyrażenie regularne jest używane do wykrywania INSERT, UPDATE, DELETE, a także wielu innych poleceń dla określonego zaplecza
Ponieważ wiele zestawów wyników nie jest obsługiwanych na poziomie SQLAlchemy, w pierwszym przykładzie wykrywanie po prostu pomija wydawanie polecenia COMMIT, ponieważ pierwszy instrukcja jest SELECT, gdzie jak w twoim drugim przykładzie jest to UPDATE. Nie ma próby wykrycia instrukcji modyfikujących dane z wielu instrukcji.
Jeśli spojrzysz na PGExecutionContext.should_autocommit_text()
, zobaczysz, że pasuje do wyrażenia regularnego z AUTOCOMMIT_REGEXP
. Innymi słowy, pasuje tylko na początku tekstu.