D'après mon expérience, ces erreurs se produisent de cette façon :
try:
code_that_executes_bad_query()
# transaction on DB is now bad
except:
pass
# transaction on db is still bad
code_that_executes_working_query() # raises transaction error
Il n'y a rien d'anormal dans la deuxième requête, mais comme la véritable erreur a été détectée, c'est la deuxième requête qui soulève l'erreur (beaucoup moins informative).
edit : cela ne se produit que si le except
clause attrape IntegrityError
(ou toute autre exception de base de données de bas niveau), si vous attrapez quelque chose comme DoesNotExist
cette erreur n'apparaîtra pas, car DoesNotExist
ne corrompt pas la transaction.
La leçon à retenir est qu'il ne faut pas faire de try/except/pass.
4 votes
Je suis curieux de savoir quelle a été votre solution finale à ce problème ? J'ai le même problème, mais comme mon hébergeur n'enregistre pas les erreurs de requête, il m'a été impossible jusqu'à présent de comprendre ce qui ne va pas.
2 votes
J'ai finalement trouvé un problème lié à l'utilisation d'une table de base de données comme support de cache. Bogue Django : code.djangoproject.com/ticket/11569 Discussion StackOverflow : stackoverflow.com/questions/1189541/
11 votes
FYI Si vous utilisez juste psycopg2 sans django,
conn.rollback()
(où conn est votre objet de connexion) supprimera l'erreur et vous pourrez exécuter d'autres requêtes.