Получено "ValueError: обнаружено неправильное число (0) ограничений для..." во время миграции Django

При использовании миграции Django 1.7 я столкнулся с миграцией, которая работала в разработке, но не в производстве:

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

Это вызвано правилом AlterUniqueTogether:

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

Чтение ошибок и т.д. в DB DB ошибок, похоже, связано с существующим unique_together в db, не совпадающим с историей миграции.

Как я могу обойти эту ошибку и завершить мои миграции?

Ответ 1

(ответ Postgres и MySQL)

Если вы посмотрите на свою фактическую таблицу (используйте \d table_name) и посмотрите на индексы, вы найдете запись для вашего уникального ограничения. Это то, что Django пытается найти и отбросить. Но он не может найти точное совпадение.

Например,

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

В моем случае порядок клавиш (d, a, b, c) не соответствовал ограничению, которое он хотел бы удалить (a, b, c, d).

Я вернулся в историю миграции и изменил исходный AlterUniqueTogether, чтобы соответствовать фактическому порядку в базе данных.

Миграция затем успешно завершена.

Ответ 2

У меня была похожая проблема, когда я переключал CharField, чтобы стать ForeignKey. Все работало с этим процессом, но я остался с Джанго, думая, что все еще нужно обновить unique_together в новой миграции. (Даже если все выглядело правильно изнутри postgres.) К сожалению, применение этой новой миграции приведет к аналогичной ошибке:

ValueError: Found wrong number (0) of constraints for program(name, funder, payee, payer, location, category)

Исправление, которое в конечном итоге сработало для меня, состояло в том, чтобы закомментировать все предыдущие операции AlterUniqueTogether для этой модели. manage.py migrate работал без ошибок после этого.