Проблема здесь в том, как 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)