sql >> Base de Datos >  >> RDS >> PostgreSQL

SQLalchemy no confirma cambios al establecer el rol

El problema aquí es cómo sqlalchemy decide emitir un compromiso después de cada declaración.

si se pasa un texto a engine.execute , sqlalchemy intentará determinar si el texto es un DML o DDL usando la siguiente expresión regular. Puedes encontrarlo en las fuentes aquí

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

Esto solo detecta las palabras si están al comienzo del texto, ignorando cualquier espacio en blanco inicial. Entonces, aunque tu primer intento # works fine , el segundo ejemplo no reconoce que se debe emitir una confirmación después de ejecutar la declaración porque la primera palabra es SET .

En su lugar, sqlalchemy emite una reversión, por lo que # appears to succeed/does NOT throw any error .

la solución más simple es confirmar manualmente.

ejemplo:

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

o envuelva el sql en text y establecer autocommit=True , como se muestra en la documentación

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