sql >> Base de Datos >  >> RDS >> PostgreSQL

La ejecución de varias declaraciones con Postgresql a través de SQLAlchemy no persiste los cambios

La forma en que funciona la confirmación automática de SQLAlchemy es que inspecciona las declaraciones emitidas, tratando de detectar si los datos se modifican o no:

..., SQLAlchemy implementa su propia función de "compromiso automático" que funciona de manera completamente consistente en todos los backends. Esto se logra mediante la detección de declaraciones que representan operaciones de cambio de datos, es decir, INSERTAR, ACTUALIZAR, ELIMINAR, así como declaraciones de lenguaje de definición de datos (DDL) como CREAR TABLA, ALTERAR TABLA, y luego emitir un COMMIT automáticamente si no hay ninguna transacción en curso. . La detección se basa en la presencia de autocommit=True opción de ejecución en la instrucción. Si la declaración es una declaración de solo texto y el indicador no está establecido, se usa una expresión regular para detectar INSERTAR, ACTUALIZAR, ELIMINAR, así como una variedad de otros comandos para un back-end en particular

Dado que no se admiten múltiples conjuntos de resultados en el nivel de SQLAlchemy, en su primer ejemplo, la detección simplemente omite emitir un COMMIT porque el primero declaración es una SELECCIÓN, mientras que en su segundo ejemplo es una ACTUALIZACIÓN. No se realiza ningún intento de detectar sentencias de modificación de datos de varias sentencias.

Si observa PGExecutionContext.should_autocommit_text() , verá que hace una coincidencia de expresiones regulares con AUTOCOMMIT_REGEXP . En otras palabras, solo coincide al principio del texto.