Въпросът тук е как sqlalchemy решава да издаде комит след всяко изявление.
ако се подаде текст към engine.execute
, sqlalchemy ще се опита да определи дали текстът е DML или DDL, използвайки следния регулярен израз. Можете да го намерите в източниците тук
AUTOCOMMIT_REGEXP = re.compile(
r"\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)", re.I | re.UNICODE
)
Това открива думите само ако са в началото на текста, игнорирайки всички водещи бели интервали. Така че, докато първият ви опит # works fine
, вторият пример не успява да разпознае, че трябва да бъде издаден комит след изпълнението на оператора, защото първата дума е SET
.
Вместо това sqlalchemy издава връщане назад, така че # appears to succeed/does NOT throw any error
.
най-простото решение е ръчното извършване на ангажимент.
пример:
engine.execute("SET ROLE read_write; CREATE table testpublic (id int, val text); COMMIT;")
или увийте sql в text
и задайте autocommit=True
, както е показано в документацията
stmt = text('set role read_write; create table testpublic (id int, val text);').execution_options(autocommit=True)
e.execute(stmt)