django.db.utils.IntegrityError:重复键值违反唯一约束"django_content_type_pkey"

JDa*_*ies 18 python django postgresql

遇到一个问题,当我运行' python manage.py syncdb'我正在一个相当古老的网站上工作时,我收到上述错误消息.它用postgres DB运行django 1.2.6.

运行没有安装南部,我设法让它工作.然python manage.py schemamigration --initial contact_enquiries其运行良好,问我迁移.然后我跑python manage.py migrate contact_enquiries了然后我得到了与上面相同的错误.

它并没有抱怨我的模型中的任何语法,这就是为什么我感到困惑.这是我的模型,希望这将有所启发.

from django.db import models

class DocumentUpload(models.Model):
    name = models.CharField(max_length="200")

    document_upload = models.FileField(upload_to="uploads/documents")


    def __unicode__(self):
        return "%s" % self.name

class DocumentRequest(models.Model):
    name = models.CharField(max_length="200")

    company = models.CharField(max_length="200")

    job_title = models.CharField(max_length="200")

    email = models.EmailField(max_length="200")

    report = models.ManyToManyField(DocumentUpload)

    def __unicode__(self):
        return "%s" % self.name
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请告诉我.

谢谢!

Wol*_*lph 43

虽然我不是100%肯定这是问题,但你的序列很可能已经过时了.

在Postgres中执行此操作是否可以解决问题?

SELECT setval('django_content_type_id_seq', (SELECT MAX(id) FROM django_content_type));
Run Code Online (Sandbox Code Playgroud)


Kom*_*omu 7

这通常意味着您的主键序列已经不同步.这可能是由于迁移不良等原因造成的.
要解决这个问题;
1.启动dbshel​​l
python manage.py dbshell
2.找到主键的当前最高值
select max(id) from django_content_type;
3.将主键序列更改为现在从高于步骤2中找到的值的值开始.
因此,假设步骤2中返回的值为290780,则更改序列以大于290780的数字开头
alter sequence django_content_type_id_seq restart with 295000;


小智 5

这意味着您的数据库中的序列已过时(之前的迁移不正确或不同版本的代码之间的跳转导致以混乱的顺序应用迁移可能会导致这种损坏的状态)。要快速解决此问题,您可以手动更新数据库中的值。

python manage.py dbshell
Run Code Online (Sandbox Code Playgroud)

检查下表的当前值

SELECT last_value FROM django_migrations_id_seq;
SELECT last_value FROM django_content_type_id_seq;
Run Code Online (Sandbox Code Playgroud)

然后使用下面的命令更新它们(任何大于上面输出中的值的正常值)。通常,第一个命令就足够了,但如果您仍然收到键值违反唯一约束“django_content_type_pkey”的错误,您还需要运行第二个命令(您可能还需要根据您的数据库状态更改 auth_permission_id_seq )

ALTER SEQUENCE django_migrations_id_seq RESTART WITH {value_greater_than_last_value};
ALTER SEQUENCE django_content_type_id_seq RESTART WITH {value_greater_than_last_value};
Run Code Online (Sandbox Code Playgroud)

即使在此之后,您也会收到错误。你用

SELECT last_value FROM auth_permission_id_seq;
Run Code Online (Sandbox Code Playgroud)

将值加一

ALTER SEQUENCE auth_permission_id_seq RESTART WITH {value_greater_than_last_value};
Run Code Online (Sandbox Code Playgroud)