sql >> Databáze >  >> RDS >> PostgreSQL

SQLalchemy neprovádí změny při nastavování role

Jde o to, jak se sqlalchemy rozhodne vydat potvrzení po každém příkazu.

pokud je text předán do engine.execute , sqlalchemy se pokusí určit, zda je text DML nebo DDL pomocí následujícího regulárního výrazu. Najdete jej ve zdrojích zde

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

To detekuje slova pouze v případě, že jsou na začátku textu, přičemž ignoruje všechny úvodní mezery. Takže zatímco váš první pokus # works fine , druhý příklad nedokáže rozpoznat, že po provedení příkazu je třeba provést potvrzení, protože první slovo je SET .

Místo toho sqlalchemy vydá vrácení zpět, takže # appears to succeed/does NOT throw any error .

nejjednodušším řešením je ruční potvrzení.

příklad:

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

nebo zabalte sql do text a nastavte autocommit=True , jak je uvedeno v dokumentaci

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



  1. Odeslání pole hodnot do procedury Oracle k použití v klauzuli WHERE IN

  2. Stránkování MySQL bez dvojitého dotazování?

  3. Použití Oracle JDeveloper 12c s Oracle Database 12c na platformě Oracle Cloud, část 1

  4. Monitorování počítadel výkonu prostřednictvím PERFMON | Odstraňování problémů s výkonem serveru SQL -3