PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Durch das Aufrufen einer gespeicherten Funktion oder Prozedur werden keine Änderungen eingefügt und beibehalten

Dieser spezielle Anwendungsfall wird in „Understanding Autocommit“ herausgegriffen:

Die volle Kontrolle über das „Autocommit“-Verhalten ist mit dem generativen Connection.execution_options() verfügbar Methode, die auf Connection bereitgestellt wird , Engine , Executable , indem Sie das „autocommit“-Flag verwenden, das das Autocommit für den ausgewählten Bereich ein- oder ausschaltet. Zum Beispiel ein text() Konstrukt, das eine gespeicherte Prozedur darstellt, die von Commits verwendet werden könnte, sodass eine SELECT-Anweisung ein COMMIT ausgibt:

engine.execute(text("SELECT my_mutating_procedure()").execution_options(autocommit=True))

Die Art und Weise, wie SQLAlchemy Autocommit Datenänderungsvorgänge erkennt, besteht darin, dass es die Anweisung mit einem Muster abgleicht und nach Dingen wie UPDATE, DELETE und dergleichen sucht. Es ist unmöglich zu erkennen, ob eine gespeicherte Funktion/Prozedur Mutationen durchführt, und daher wird eine explizite Kontrolle über Autocommit bereitgestellt.

Die Sequenz wird auch bei einem Fehler inkrementiert, da nextval() und setval() Aufrufe werden nie zurückgesetzt.