Начинът, по който работи автокомитът на SQLAlchemy е, че проверява издадените оператори, опитвайки се да открие дали данните са променени или не:
..., SQLAlchemy внедрява своя собствена функция за „автоматично записване“, която работи напълно последователно във всички бекендове. Това се постига чрез откриване на оператори, които представляват операции за промяна на данните, т.е. INSERT, UPDATE, DELETE, както и изрази на езика за дефиниране на данни (DDL) като CREATE TABLE, ALTER TABLE и след това автоматично издаване на COMMIT, ако не е в ход транзакция . Откриването се основава на наличието на
autocommit=True
опция за изпълнение на изявлението. Ако изразът е само текстов израз и флагът не е зададен, се използва регулярен израз за откриване на INSERT, UPDATE, DELETE, както и различни други команди за конкретен бекенд
Тъй като множество набори от резултати не се поддържат на ниво SQLAlchemy, във вашия първи пример откриването просто пропуска издаването на COMMIT, тъй като първият изразът е SELECT, където както във втория ви пример е UPDATE. Не се извършва опит за откриване на оператори за модифициране на данни от множество оператори.
Ако погледнете PGExecutionContext.should_autocommit_text()
, ще видите, че прави съответствие с регулярен израз срещу AUTOCOMMIT_REGEXP
. С други думи, съвпада само в началото на текста.