web-dev-qa-db-fra.com

"ValueError: nombre incorrect de contraintes trouvé pour ..." reçu pendant la migration Django

En utilisant Django 1.7 migrations, je suis tombé sur une migration qui fonctionnait en développement, mais pas en production:

ValueError: Found wrong number (0) of constraints for table_name(a, b, c, d)

Cela est dû à une règle AlterUniqueTogether:

   migrations.AlterUniqueTogether(
         name='table_name',
         unique_together=set([('a', 'b')]),
   )

La lecture des bogues et autres dans la base de données Django bug semble concerner le unique_together dans la base de données ne correspondant pas à l'historique de migration.

Comment contourner cette erreur et terminer mes migrations?

20
rrauenza

(Réponse Postgres et MySQL)

Si vous regardez votre table actuelle (utilisez \d table_name) et regardez les index, vous trouverez une entrée pour votre contrainte unique. C'est ce que Django essaie de trouver et de supprimer. Mais il ne peut pas trouver une correspondance exacte.

Par exemple,

"table_name_...6cf2a9c6e98cbd0d_uniq" UNIQUE CONSTRAINT, btree (d, a, b, c)

Dans mon cas, l'ordre des clés (d, a, b, c) ne correspondait pas à la contrainte qu'il cherchait à supprimer (a, b, c, d).

Je suis retourné dans mon historique de migration et j'ai modifié le AlterUniqueTogether d'origine pour qu'il corresponde à l'ordre réel dans la base de données.

La migration s'est ensuite terminée avec succès.

29
rrauenza