收到" ValueError:找到错误的数字(0)的约束..."在Django迁移期间

时间:2017-01-12 21:44:05

标签: django django-migrations

在使用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')]),
   )

在Django bug DB中读取bug等,似乎是db中与迁移历史记录不匹配的现有unique_together

如何解决此错误并完成迁移?

6 个答案:

答案 0 :(得分:24)

(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以匹配数据库中的实际顺序。

然后迁移成功完成。

答案 1 :(得分:1)

“数据库中的唯一索引与迁移历史记录不匹配”-每次在表上更改索引时,它都会检查其先前的索引并将其删除。您的情况无法获取先前的索引。

解决方案- 1.您可以手动生成 2.或者恢复到使用先前索引的代码并进行迁移。然后最终在代码中更改为新索引并运行迁移。(需要处理django_migration文件)

答案 2 :(得分:0)

我在切换CharField成为ForeignKey时遇到了类似的问题。一切都与该过程一起工作,但是让Django认为仍然需要在新迁移中更新unique_together。 (即使从postgres内部看起来一切正常。)不幸的是,应用此新迁移将产生类似的错误:

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

最终对我有用的解决方法是为该模型注释掉所有先前的AlterUniqueTogether操作。之后manage.py migrate正常工作。

答案 3 :(得分:0)

还值得检查的是,有关表的唯一索引的预期数量。

例如,如果您的表具有多个唯一索引,则应删除它们以确保仅存在1(或任何数量的预期唯一索引)预迁移索引。

要检查PostgreSQL中给定表有多少个唯一索引:

SELECT *
FROM information_schema.table_constraints AS c
WHERE
    c.table_name = '<table_name>'
    and c.constraint_type = 'UNIQUE'

答案 4 :(得分:0)

以防万一有人遇到这个问题并且以前的答案还没有解决,在我的情况下,问题是当我修改唯一共同约束时,尝试了迁移,但是数据不允许迁移(因为更具限制性的唯一共同约束)。但是,迁移设法从表中删除了唯一的共同约束,从而使其处于不一致状态。我必须迁移回零,然后重新应用没有数据的迁移。然后顺利进行。

总而言之,在应用迁移之前,请确保您的数据能够在 之前接受新的约束。

答案 5 :(得分:0)

  1. 找到各自表的最新迁移文件,找到唯一的 在一起,并替换当前唯一的约束字段。
  2. 使用 ./manage.py migrate your_app_name 迁移数据库。
  3. 恢复或撤消之前的迁移文件。