Het probleem hier hoe sqlalchemy besluit om na elke instructie een commit uit te geven.
als een tekst wordt doorgegeven aan engine.execute
, zal sqlalchemy proberen te bepalen of de tekst een DML of DDL is met behulp van de volgende regex. Je kunt het hier in de bronnen vinden
AUTOCOMMIT_REGEXP = re.compile(
r"\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)", re.I | re.UNICODE
)
Dit detecteert alleen de woorden als ze aan het begin van de tekst staan, en negeert eventuele voorloopspaties. Dus terwijl je eerste poging # works fine
, het tweede voorbeeld herkent niet dat een commit moet worden uitgegeven nadat de instructie is uitgevoerd, omdat het eerste woord SET
is .
In plaats daarvan voert sqlalchemy een rollback uit, dus # appears to succeed/does NOT throw any error
.
de eenvoudigste oplossing is om handmatig vast te leggen.
voorbeeld:
engine.execute("SET ROLE read_write; CREATE table testpublic (id int, val text); COMMIT;")
of, wikkel de sql in text
en stel autocommit=True
. in , zoals weergegeven in de documentatie
stmt = text('set role read_write; create table testpublic (id int, val text);').execution_options(autocommit=True)
e.execute(stmt)