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

SQLalchemy non esegue il commit delle modifiche durante l'impostazione del ruolo

Il problema qui come sqlalchemy decide di emettere un commit dopo ogni istruzione.

se un testo viene passato a engine.execute , sqlalchemy tenterà di determinare se il testo è un DML o DDL utilizzando l'espressione regolare seguente. Puoi trovarlo nelle fonti qui

AUTOCOMMIT_REGEXP = re.compile(
    r"\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)", re.I | re.UNICODE
)

Questo rileva le parole solo se si trovano all'inizio del testo, ignorando eventuali spazi bianchi iniziali. Quindi, mentre il tuo primo tentativo # works fine , il secondo esempio non riesce a riconoscere che è necessario emettere un commit dopo l'esecuzione dell'istruzione perché la prima parola è SET .

Invece, sqlalchemy emette un rollback, quindi # appears to succeed/does NOT throw any error .

la soluzione più semplice è eseguire il commit manualmente.

esempio:

engine.execute("SET ROLE read_write; CREATE table testpublic (id int, val text); COMMIT;")

oppure, avvolgi lo sql in text e imposta autocommit=True , come mostrato nella documentazione

stmt = text('set role read_write; create table testpublic (id int, val text);').execution_options(autocommit=True)
e.execute(stmt)