Django+Postgres: “transaction en cours est annulée, les commandes ignoré jusqu'à la fin de la transaction de bloc”
J'ai commencé à travailler sur un Django/Postgres site. Il m'arrive de travailler dans manage.py shell
, et accidentellement faire quelques DB de l'action qui entraîne une erreur. Ensuite, je suis incapable de faire tout base de données de l'action à 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 cette et cette, mais ils ne donnent pas exploitables instructions sur ce qu'il faut faire à partir de la coquille).
- j'ai eu ce problème avant et ne pouvait pas trouver un moyen de le faire...
- Doublon potentiel de this, ce qui donne presque l'identique accepté solution...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer ceci:
La discussion plus détaillée de Cette question peut être trouvée ici
connection.close()
si _rollback ne pas le faire pour vous (@ifischer)ce qui m'arrive, parfois, souvent, c'est le manque
ou
comme mentionné ici aussi
il peut également se produire dans l'autre sens, si vous avez un schemamigration dans l'attente de votre models.py. Avec sud, vous devez mettre à jour le schéma avec.
Cochez cette
La réponse rapide est généralement à son tour sur la base de données de validation automatique en ajoutant:
Les paramètres de base de données.
J'ai eu ce message d'erreur après la restauration d'une sauvegarde à un totalement vide DB. Il s'en alla après l'exécution:
Peut-être il y avait quelques modèles internes manquantes à partir de la décharge...
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% sur qui (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:
django.db.close_connection
est une fonction doit être appelée avec()
si vous voulez qu'il fasse quoi que ce soit 😉 j'ai aussi souvent faire undjango.db.connection.close()
qui peut être un alias parclose_connection
, je ne sais pas.Si vous obtenez une erreur lors de l'exécution de
migrate
(Sud), il peut être que vous avez beaucoup de changements dans le schéma de base de données et souhaitez gérer tout à la fois. Postgres est un peu méchant sur que. Ce qui fonctionne toujours, est pour une pause d'une grande migration en petites étapes. Très probablement, vous êtes à l'aide d'un système de contrôle de version.Ainsi, la situation décrite ci-dessus, procédez comme suit:
Et vous avez terminé. 🙂
Il devrait fonctionner parfaitement.
Si vous utilisez une version de django avant 1.6, alors vous devriez utiliser Christophe excellente xact module.
xact est une recette pour le traitement des transactions de façon raisonnable dans Django applications sur PostgreSQL.
Remarque: de Django 1.6, la fonctionnalité de xact sera fusionné avec le Django de base comme le atomique décorateur. Le Code qui utilise xact devrait être en mesure de migrer vers atomique avec juste un rechercher-remplacer. atomique fonctionne sur des bases de données PostgreSQL, est thread-safe, et a d'autres fonctionnalités intéressantes; passer quand vous le pouvez!
- Je ajouter ce qui suit à mon fichier de paramètres, parce que j'aime la validation automatique de la fonctionnalité quand je suis en "jouant", mais ne voulez pas active lorsque mon site est en cours d'exécution autrement.
De sorte à obtenir autocommit juste en shell, j'ai fais ce petit hack:
REMARQUE: Cette seconde partie est tout simplement parce que je travaille dans PyCharm, qui ne marche pas exécuter directement manage.py
J'ai eu cette erreur dans Django 1.7. Lorsque j'ai lu dans la documentation que
Je suis un peu méfiant. Les erreurs qui s'est passé, quand j'ai essayé de courir les migrations. Il s'est avéré que certains de mes modèles avaient
my_field = MyField(default=some_function)
. Disposant de cette fonction en tant que par défaut pour un champ fonctionne bien avec sqlite et mysql (j'ai eu quelques erreurs d'importation, mais j'ai réussi à le faire fonctionner), mais il semble ne pas fonctionner pour postgresql, et il a cassé les migrations au point que je n'ai pas d'événement obtenez un message d'erreur utile, mais à la place l'un de l'questions de titre.