Spørgsmålet her, hvordan sqlalchemy beslutter at udstede en commit efter hver erklæring.
hvis en tekst sendes til engine.execute
, vil sqlalchemy forsøge at bestemme, om teksten er en DML eller DDL ved hjælp af følgende regex. Du kan finde det i kilderne her
AUTOCOMMIT_REGEXP = re.compile(
r"\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)", re.I | re.UNICODE
)
Dette registrerer kun ordene, hvis de er i starten af teksten, og ignorerer eventuelle mellemrum. Så mens dit første forsøg # works fine
, genkender det andet eksempel ikke, at der skal udstedes en commit efter sætningen er udført, fordi det første ord er SET
.
I stedet udsteder sqlalchemy en tilbagerulning, så det # appears to succeed/does NOT throw any error
.
den enkleste løsning er at forpligte sig manuelt.
eksempel:
engine.execute("SET ROLE read_write; CREATE table testpublic (id int, val text); COMMIT;")
eller pak sql'en ind i text
og indstil autocommit=True
, som vist i dokumentationen
stmt = text('set role read_write; create table testpublic (id int, val text);').execution_options(autocommit=True)
e.execute(stmt)