Jde o to, jak se sqlalchemy rozhodne vydat potvrzení po každém příkazu.
pokud je text předán do engine.execute
, sqlalchemy se pokusí určit, zda je text DML nebo DDL pomocí následujícího regulárního výrazu. Najdete jej ve zdrojích zde
AUTOCOMMIT_REGEXP = re.compile(
r"\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)", re.I | re.UNICODE
)
To detekuje slova pouze v případě, že jsou na začátku textu, přičemž ignoruje všechny úvodní mezery. Takže zatímco váš první pokus # works fine
, druhý příklad nedokáže rozpoznat, že po provedení příkazu je třeba provést potvrzení, protože první slovo je SET
.
Místo toho sqlalchemy vydá vrácení zpět, takže # appears to succeed/does NOT throw any error
.
nejjednodušším řešením je ruční potvrzení.
příklad:
engine.execute("SET ROLE read_write; CREATE table testpublic (id int, val text); COMMIT;")
nebo zabalte sql do text
a nastavte autocommit=True
, jak je uvedeno v dokumentaci
stmt = text('set role read_write; create table testpublic (id int, val text);').execution_options(autocommit=True)
e.execute(stmt)