PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

L'exécution de plusieurs instructions avec Postgresql via SQLAlchemy ne conserve pas les modifications

Le fonctionnement de la validation automatique de SQLAlchemy consiste à inspecter les instructions émises, en essayant de détecter si les données sont modifiées ou non :

..., SQLAlchemy implémente sa propre fonctionnalité "autocommit" qui fonctionne de manière totalement cohérente sur tous les backends. Ceci est réalisé en détectant les instructions qui représentent des opérations de modification de données, c'est-à-dire INSERT, UPDATE, DELETE, ainsi que des instructions en langage de définition de données (DDL) telles que CREATE TABLE, ALTER TABLE, puis en émettant automatiquement un COMMIT si aucune transaction n'est en cours. . La détection est basée sur la présence du autocommit=True option d'exécution sur l'instruction. Si l'instruction est une instruction de texte uniquement et que l'indicateur n'est pas défini, une expression régulière est utilisée pour détecter INSERT, UPDATE, DELETE, ainsi qu'une variété d'autres commandes pour un backend particulier

Étant donné que plusieurs ensembles de résultats ne sont pas pris en charge au niveau de SQLAlchemy, dans votre premier exemple, la détection omet simplement d'émettre un COMMIT car le premier instruction est un SELECT, où, comme dans votre deuxième exemple, il s'agit d'un UPDATE. Aucune tentative de détection des déclarations de modification de données à partir de plusieurs déclarations n'a lieu.

Si vous regardez PGExecutionContext.should_autocommit_text() , vous verrez qu'il fait une correspondance regex avec AUTOCOMMIT_REGEXP . En d'autres termes, il correspond uniquement au début du texte.