如何列出表上的所有唯一性约束并删除任何与我的 Django 迁移冲突的约束?
许多其他 StackOverflow 问题都询问了“关系已存在”错误,但这是特定于唯一性约束的。我不想要通常推荐的伪造迁移方法
python manage.py migrate --fake
。我只想删除冲突的约束,以便迁移可以正常进行。
我尝试添加一个唯一的在一起约束,它在本地运行良好,但在远程导致“django.db.utils.ProgrammingError:关系已经存在”错误。具体来说,我收到这样的错误。
django.db.utils.ProgrammingError: relation "api_mytable_myfield1_myfield2_cb8c1059_uniq" already exists
我的迁移文件如下所示:
class Migration(migrations.Migration):
dependencies = [
('api', '...'),
]
operations = [
migrations.AlterUniqueTogether(
name='mytable',
unique_together={('myfield', 'myfield2')},
),
]
我怎样才能让一切恢复正常?我正在使用 Postgres。
您可以在表中列出约束,打开 Postgres shell 并执行
\d mytable
。找到约束的名称后,您可以使用以下内容将其删除:
ALTER TABLE mytable DROP CONSTRAINT mytable_myfield1_myfield2_cb8c1059_uniq;
请不要手动更改数据库。如果以后再迁移另一个数据库,也会产生同样的问题。迁移的想法是创建一个数据库,而不必手动与数据库交互。
一个问题是 Django 没有
,只有一个DeleteUniqueTogether
AlterUniqueTogether
[Django-doc] 并且可能这在不久的将来不会改变:unique_together
不应该再使用. Django 有一个约束框架 [Django-doc].
你的
MyTable
因此应该使用:
类 MyTable(模型。模型): # ...
class Meta:
constraints = [
models.<b>UniqueConstraint(</b>
fields=('myfield1', 'myfield2'),
name='mytable_myfield1_myfield2_cb8c1059_uniq'
)
<b>]</b>
如果有特定原因导致不可能,您应该让迁移运行查询:
class Migration(migrations.Migration):
dependencies = [
('api', '...'),
]
operations = [
migrations.RunSQL(
'ALTER TABLE mytable DROP CONSTRAINT mytable_myfield1_myfield2_cb8c1059_uniq;'
),
migrations.AlterUniqueTogether(
name='mytable',
unique_together={('myfield', 'myfield2')},
),
]