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)