J'ai eu beaucoup d'erreurs avec le message:
"DatabaseError: current transaction is aborted, commands ignored until end of transaction block"
après être passé de python-psycopg à python-psycopg2 en tant que moteur de base de données du projet Django.
Le code reste le même, mais je ne sais pas d'où viennent ces erreurs.
conn.rollback()
(où conn est votre objet de connexion) effacera l'erreur afin que vous puissiez exécuter d'autres requêtesRéponses:
C'est ce que fait postgres lorsqu'une requête produit une erreur et que vous essayez d'exécuter une autre requête sans d'abord annuler la transaction. (Vous pouvez le considérer comme une fonction de sécurité, pour vous empêcher de corrompre vos données.)
Pour résoudre ce problème, vous devez déterminer où dans le code cette mauvaise requête est exécutée. Il peut être utile d'utiliser les options log_statement et log_min_error_statement dans votre serveur postgresql.
la source
Pour supprimer l'erreur, annulez la dernière transaction (erronée) après avoir corrigé votre code:
Vous pouvez utiliser try-except pour éviter que l'erreur ne se produise:
Voir: documentation Django
la source
IntegrityError
et non la classe de baseDatabaseError
?Donc, je suis tombé sur ce même problème. Le problème que je rencontrais ici était que ma base de données n'était pas correctement synchronisée. Les problèmes simples semblent toujours provoquer le plus d'angoisse ...
Pour synchroniser votre base de données django, à partir de votre répertoire d'application, dans le terminal, tapez:
Edit: Notez que si vous utilisez django-south, l'exécution de la commande '$ python manage.py migrate' peut également résoudre ce problème.
Bon codage!
la source
python manage.py migrate <app>
... pour toutes mes applications.django-south
- lamigrate
commande n'est pas intégrée à django.Dans Flask, il vous suffit d'écrire:
La documentation PS va ici https://www.postgresql.org/docs/9.4/static/sql-rollback.html
la source
D'après mon expérience, ces erreurs se produisent de cette façon:
Il n'y a rien de mal avec la deuxième requête, mais comme l'erreur réelle a été détectée, la deuxième requête est celle qui déclenche l'erreur (beaucoup moins informative).
edit: cela ne se produit que si la
except
clause intercepteIntegrityError
(ou toute autre exception de base de données de bas niveau), si vous interceptez quelque chose commeDoesNotExist
cette erreur ne se produira pas, carDoesNotExist
cela ne corrompra pas la transaction.La leçon ici est de ne pas essayer / sauf / passer.
la source
Je pense que le modèle que Priest mentionne est plus susceptible d'être la cause habituelle de ce problème lors de l'utilisation de PostgreSQL.
Cependant, je pense qu'il existe des utilisations valides pour le modèle et je ne pense pas que ce problème devrait être une raison de toujours l'éviter. Par exemple:
Si vous vous sentez bien avec ce modèle, mais que vous souhaitez éviter le code de gestion de transaction explicite partout, vous pouvez envisager d'activer le mode de validation automatique (PostgreSQL 8.2+): https://docs.djangoproject.com/en/ dev / ref / databases / # mode autocommit
Je ne sais pas s'il existe des considérations de performances importantes (ou de tout autre type).
la source
Si vous obtenez cela dans le shell interactif et avez besoin d'une solution rapide, procédez comme suit:
vu à l'origine dans cette réponse
la source
J'ai rencontré un comportement similaire lors de l'exécution d'une transaction défectueuse sur le
postgres
terminal. Rien ne s'est passé après cela, car ledatabase
est dans un état deerror
. Cependant, juste comme une solution rapide, si vous pouvez vous permettre d'éviterrollback transaction
. La suite a fait l'affaire pour moi:COMMIT;
la source
J'ai le problème de Silimar. La solution était de migrer la base de données (
manage.py syncdb
oumanage.py schemamigration --auto <table name>
si vous utilisez le sud).la source
utilisez simplement la restauration
Exemple de code
la source
J'ai juste eu cette erreur aussi, mais elle masquait un autre message d'erreur plus pertinent où le code essayait de stocker une chaîne de 125 caractères dans une colonne de 100 caractères:
J'ai dû déboguer le code pour que le message ci-dessus apparaisse, sinon il affiche
la source
En réponse à @priestc et @Sebastian, que faire si vous faites quelque chose comme ça?
Je viens d'essayer ce code et il semble fonctionner, échouant silencieusement sans avoir à se soucier d'éventuelles erreurs et fonctionnant lorsque la requête est bonne.
la source
Je crois que la réponse de @ AnujGupta est correcte. Cependant, la restauration peut elle-même déclencher une exception que vous devez intercepter et gérer:
Si vous constatez que vous réécrivez ce code à divers
save()
endroits, vous pouvez extraire la méthode:Enfin, vous pouvez le peaufiner en utilisant un décorateur qui protège les méthodes qui utilisent
save()
:Même si vous implémentez le décorateur ci-dessus, il est toujours pratique de le conserver
try_rolling_back()
comme méthode extraite au cas où vous auriez besoin de l'utiliser manuellement dans les cas où une manipulation spécifique est requise, et la manipulation générique du décorateur n'est pas suffisante.la source
C'est un comportement très étrange pour moi. Je suis surpris que personne ne pense aux points de sauvegarde. Dans mon code, une requête ayant échoué était un comportement attendu:
J'ai changé le code de cette façon pour utiliser les points de sauvegarde:
la source
Dans Flask shell, tout ce que je devais faire était
session.rollback()
de surmonter cela.la source
J'ai rencontré ce problème, l'erreur apparaît car les transactions d'erreur ne se sont pas terminées correctement, j'ai trouvé la
postgresql_transactions
commande de Transaction Control iciContrôle des transactions
Les commandes suivantes sont utilisées pour contrôler les transactions
donc j'utilise
END TRANSACTION
pour mettre fin à la TRANSACTION d'erreur, code comme ceci:la source
vous pouvez désactiver la transaction via "set_isolation_level (0)"
la source