sql >> Database >  >> RDS >> PostgreSQL

SQLalchemy voert geen wijzigingen door bij het instellen van de rol

Het probleem hier hoe sqlalchemy besluit om na elke instructie een commit uit te geven.

als een tekst wordt doorgegeven aan engine.execute , zal sqlalchemy proberen te bepalen of de tekst een DML of DDL is met behulp van de volgende regex. Je kunt het hier in de bronnen vinden

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

Dit detecteert alleen de woorden als ze aan het begin van de tekst staan, en negeert eventuele voorloopspaties. Dus terwijl je eerste poging # works fine , het tweede voorbeeld herkent niet dat een commit moet worden uitgegeven nadat de instructie is uitgevoerd, omdat het eerste woord SET is .

In plaats daarvan voert sqlalchemy een rollback uit, dus # appears to succeed/does NOT throw any error .

de eenvoudigste oplossing is om handmatig vast te leggen.

voorbeeld:

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

of, wikkel de sql in text en stel autocommit=True . in , zoals weergegeven in de documentatie

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



  1. Verwijzend naar een geselecteerde alias van een geaggregeerde kolom in de hebbende clausule in Postgres

  2. Heroku Postgresql met Google Datastudio

  3. Hoe de Modulo-operator werkt in MariaDB

  4. Ongeldige Oracle-URL opgegeven:OracleDataSource.makeURL