sql >> Database teknologi >  >> RDS >> PostgreSQL

SQLalchemy begår ikke ændringer ved indstilling af rolle

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)



  1. Hvor fleksible/begrænsende er SQLite-kolonnetyper?

  2. Er der noget galt med joins, der ikke bruger JOIN nøgleordet i SQL eller MySQL?

  3. implementer LIKE-forespørgsel i PDO

  4. Kan SQL Server Express LocalDB tilsluttes eksternt?