“django.db.utils.ProgrammingError:关系已经存在”对于唯一的在一起约束

问题描述 投票:0回答:2

如何列出表上的所有唯一性约束并删除任何与我的 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。

django postgresql django-migrations
2个回答
0
投票

您可以在表中列出约束,打开 Postgres shell 并执行

\d mytable
。找到约束的名称后,您可以使用以下内容将其删除:

ALTER TABLE mytable DROP CONSTRAINT mytable_myfield1_myfield2_cb8c1059_uniq;

0
投票

不要手动更改数据库。如果以后再迁移另一个数据库,也会产生同样的问题。迁移的想法是创建一个数据库,而不必手动与数据库交互。

一个问题是 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')},
        ),
    ]
© www.soinside.com 2019 - 2024. All rights reserved.