82 votes

Django + Postgres: "la transaction en cours est abandonnée, les commandes sont ignorées jusqu'à la fin du bloc de transaction"

J'ai commencé à travailler sur un Django/Postgres site. Il m'arrive de travailler en manage.py shell, et accidentellement faire quelques DB de l'action qui entraîne une erreur. Ensuite, je suis incapable de faire toute opération de base de données à tous, parce que pour toute opération de base de données que j'essaie de faire, j'obtiens l'erreur:

current transaction is aborted, commands ignored until end of transaction block

Ma solution actuelle est de redémarrer le shell, mais je devrais trouver un moyen de résoudre ce problème sans abandonner ma session shell.

(J'ai lu ceci et cela, mais ils ne donnent pas exploitables instructions sur ce qu'il faut faire à partir de la coquille).

126voto

Vsevolod Dyomkin Points 6245

Vous pouvez essayer ceci:

 from django.db import connection
connection._rollback()
 

La discussion plus détaillée de ce problème peut être trouvée ici: https://code.djangoproject.com/ticket/10813

34voto

yvess Points 510

cela m'arrive parfois, souvent c'est le manque

 manage.py migrate 
 

ou

 manage.py syncdb
 

comme mentionné aussi ici

cela peut aussi arriver dans l'autre sens, si vous avez une migration schemam en attente de votre fichier models.py Avec south, vous devez mettre à jour le schéma.

 manage.py schemamigration mymodel --auto
 

13voto

Ignacio Pérez Points 172

Vérifie ça

La réponse rapide consiste généralement à activer la validation automatique au niveau de la base de données en ajoutant:

 'OPTIONS': {'autocommit': True,}
 

Aux paramètres de la base de données.

3voto

Richard Points 382

J'ai eu cette erreur après la restauration d'une sauvegarde sur une base de données totalement vide. Il est parti après avoir couru:

 ./manage syncdb 
 

Peut-être y avait-il des modèles internes manquants dans la décharge ...

3voto

ifischer Points 4726

AVERTISSEMENT: le patch ci-dessous peut éventuellement provoquer des transactions étant laissé dans un état ouvert sur la db (au moins avec postgres). Pas sûr à 100% (et comment les corriger), mais je vous suggère fortement de ne pas faire le patch ci-dessous sur les bases de données de production.

Que l'on a accepté la réponse ne résout pas mes problèmes, dès que je reçois un DB d'erreur, je ne le suis toute nouvelle DB actions, même avec un manuel de restauration - je suis venu avec ma propre solution.

Quand je suis en cours d'exécution Django-shell, je patch Django pour fermer la connexion DB dès que des erreurs se produisent. De cette façon, je ne jamais avoir à penser à l'annulation de transactions ou de la manipulation de la connexion.

C'est le code je suis de chargement au début de mon Django-shell-session:

from django import db
from django.db.backends.util import CursorDebugWrapper
old_execute = CursorDebugWrapper.execute
old_execute_many = CursorDebugWrapper.executemany

def execute_wrapper(*args, **kwargs):
    try:
        old_execute(*args, **kwargs)
    except Exception, ex:
        logger.error("Database error:\n%s" % ex)
        db.close_connection

def execute_many_wrapper(*args, **kwargs):
    try:
        old_execute_many(*args, **kwargs)
    except Exception, ex:
        logger.error("Database error:\n%s" % ex)
        db.close_connection

CursorDebugWrapper.execute = execute_wrapper
CursorDebugWrapper.executemany = execute_many_wrapper

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X