sql >> Databasteknik >  >> RDS >> PostgreSQL

SQLalchemy begår inte ändringar vid inställning av roll

Frågan här hur sqlalchemy bestämmer sig för att utfärda en commit efter varje uttalande.

om en text skickas till engine.execute , kommer sqlalchemy att försöka avgöra om texten är en DML eller DDL med hjälp av följande regex. Du hittar det i källorna här

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

Detta upptäcker bara orden om de är i början av texten och ignorerar eventuella inledande blanksteg. Så medan ditt första försök # works fine , det andra exemplet misslyckas med att erkänna att en commit måste utfärdas efter att satsen har körts eftersom det första ordet är SET .

Istället gör sqlalchemy en återställning, så det # appears to succeed/does NOT throw any error .

den enklaste lösningen är att begå manuellt.

exempel:

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

eller linda in sql i text och ställ in autocommit=True , som visas i dokumentationen

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



  1. Hur man väljer ett visst antal tecken från vänster eller höger om en sträng i SQL Server

  2. ORA-28001:Lösenordet har upphört att gälla

  3. SQL välj max(datum) och motsvarande värde

  4. Skapa underhållsplaner i SQL Server