PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

A execução de várias instruções com o Postgresql via SQLAlchemy não persiste as alterações


A maneira como o autocommit do SQLAlchemy funciona é que ele inspeciona as instruções emitidas, tentando detectar se os dados são modificados ou não:

..., o SQLAlchemy implementa seu próprio recurso de “autocommit” que funciona de forma totalmente consistente em todos os back-ends. Isso é alcançado detectando instruções que representam operações de alteração de dados, ou seja, INSERT, UPDATE, DELETE, bem como instruções de linguagem de definição de dados (DDL), como CREATE TABLE, ALTER TABLE e, em seguida, emitindo um COMMIT automaticamente se nenhuma transação estiver em andamento . A detecção é baseada na presença do autocommit=True opção de execução na instrução. Se a instrução for uma instrução somente texto e o sinalizador não estiver definido, uma expressão regular será usada para detectar INSERT, UPDATE, DELETE, bem como uma variedade de outros comandos para um back-end específico

Como vários conjuntos de resultados não são suportados no nível SQLAlchemy, em seu primeiro exemplo a detecção simplesmente omite a emissão de um COMMIT porque o primeiro instrução é um SELECT, onde como no seu segundo exemplo é um UPDATE. Não ocorre nenhuma tentativa de detectar instruções de modificação de dados de várias instruções.

Se você olhar para PGExecutionContext.should_autocommit_text() , você verá que ele faz uma correspondência de regex com AUTOCOMMIT_REGEXP . Em outras palavras, ele corresponde apenas no início do texto.