PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

SQLalchemy не извършва промени при задаване на роля

Въпросът тук е как sqlalchemy решава да издаде комит след всяко изявление.

ако се подаде текст към engine.execute , sqlalchemy ще се опита да определи дали текстът е DML или DDL, използвайки следния регулярен израз. Можете да го намерите в източниците тук

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

Това открива думите само ако са в началото на текста, игнорирайки всички водещи бели интервали. Така че, докато първият ви опит # works fine , вторият пример не успява да разпознае, че трябва да бъде издаден комит след изпълнението на оператора, защото първата дума е SET .

Вместо това sqlalchemy издава връщане назад, така че # appears to succeed/does NOT throw any error .

най-простото решение е ръчното извършване на ангажимент.

пример:

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

или увийте sql в text и задайте autocommit=True , както е показано в документацията

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да принудим оценка на подзаявката преди присъединяване/натискане надолу към чужд сървър

  2. Автоматично увеличаване на частичен първичен ключ с Entity Framework Core

  3. SQL LIKE условие за проверка за цяло число?

  4. PostgreSQL:Показване на таблици в PostgreSQL

  5. Избройте съхранените функции, които препращат към таблица в PostgreSQL