Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django.db.utils.IntegrityError:重复的键值违反了唯一约束;django“内容”类型“pkey”;_Python_Django_Postgresql - Fatal编程技术网

Python django.db.utils.IntegrityError:重复的键值违反了唯一约束;django“内容”类型“pkey”;

Python django.db.utils.IntegrityError:重复的键值违反了唯一约束;django“内容”类型“pkey”;,python,django,postgresql,Python,Django,Postgresql,遇到了一点问题,当我在一个相当旧的站点上运行“python manage.py syncdb”时,我收到了上面的错误消息。它正在运行django 1.2.6和postgres DB 运行没有安装south,我设法让它工作。Ranpython manage.py schemamigration——最初的联系信息运行良好,要求我迁移。然后,我运行了python manage.py migrate contact_inquiries,得到了与上面相同的错误 它没有抱怨我的模型中的任何语法,这就是为什么

遇到了一点问题,当我在一个相当旧的站点上运行“
python manage.py syncdb
”时,我收到了上面的错误消息。它正在运行django 1.2.6和postgres DB

运行没有安装south,我设法让它工作。Ran
python manage.py schemamigration——最初的联系信息
运行良好,要求我迁移。然后,我运行了
python manage.py migrate contact_inquiries
,得到了与上面相同的错误

它没有抱怨我的模型中的任何语法,这就是为什么我感到困惑的原因。这是我的模型,希望能给大家一些启示

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
如果你需要更多的信息,请告诉我


谢谢

虽然我不是100%确定这是问题所在,但您的序列很可能已经过时

在Postgres中执行此操作是否解决了问题

SELECT setval('django_content_type_id_seq', (SELECT MAX(id) FROM django_content_type));

这通常意味着您的主键序列已不同步。这可能是由错误的迁移等造成的。
解决这个问题
1.启动dbshell
python manage.py dbshell

2.查找主键的当前最高值
从django_content_type中选择max(id)
3.将主键顺序更改为现在从高于步骤2中的值的值开始。
因此,假设步骤2中返回的值为290780,则将序列更改为从大于290780的数字开始
alter sequence django_content_type_id_seq以295000重新启动

我收到了这个错误:

django.db.utils.IntegrityError: duplicate key value violates unique constraint 
    "blahmodule_blahthing_blahstuff_id"
DETAIL:  Key (blahstuff_id)=(1) already exists.
可能的解决方案:

django.db.utils.IntegrityError: duplicate key value violates unique constraint 
    "blahmodule_blahthing_blahstuff_id"
DETAIL:  Key (blahstuff_id)=(1) already exists.
  • 尝试将
    blahthing
    中的
    blahtuff
    关系从
    OneToOneField
    字段迁移到
    ForeignKey
对我所用内容的解释:

django.db.utils.IntegrityError: duplicate key value violates unique constraint 
    "blahmodule_blahthing_blahstuff_id"
DETAIL:  Key (blahstuff_id)=(1) already exists.
我使用的是Django RestFramework,它是通过
ListCreateAPIView
ModelSerializer
连接起来的。无论出于什么原因,
OneToOneField
将一个
UNIQUE
附加到一个连接表
blahmodule_blahthing_blahstuff_id
,(我不确定它是否是一个连接表,这是一个假设),但无论django切换到带有QuerySet返回的ForeignKey时发生了什么魔法,都解决了我的问题

相关:

django.db.utils.IntegrityError: duplicate key value violates unique constraint 
    "blahmodule_blahthing_blahstuff_id"
DETAIL:  Key (blahstuff_id)=(1) already exists.
就上述实际问题而言:

模式:

-- Table: public.django_content_type

-- DROP TABLE public.django_content_type;

CREATE TABLE public.django_content_type
(
    id integer NOT NULL DEFAULT nextval('django_content_type_id_seq'::regclass),
    app_label character varying(100) COLLATE pg_catalog."default" NOT NULL,
    model character varying(100) COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT django_content_type_pkey PRIMARY KEY (id),
    CONSTRAINT django_content_type_app_label_model_76bd3d3b_uniq UNIQUE (app_label, model)

)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.django_content_type
    OWNER to YOURUSER;
示例行:

pk    app_label                model

1   "your_app"           "your_app_model"
2   "your_app"           "your_app_model"
3   "blah_module"        "blahthing"
4   "blah_module"        "blahstuff"

如果迁移中途失败,django\u content\u type\u app\u label\u model\u 76bd3d3b\u uniq上的散列和主键可能会变得混乱。

受Wolph启发,我的修复方法如下

SELECT setval('django_migrations_id_seq', (SELECT MAX(id) FROM django_migrations));

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

python manage.py dbshell
检查下表的当前值

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

即使在这之后,您也会遇到错误。你用

SELECT last_value FROM auth_permission_id_seq;
增值一

ALTER SEQUENCE auth_permission_id_seq RESTART WITH {value_greater_than_last_value};

事实上,他们面临着同样的问题。同样的解决方案也可以通过pgAdmin实现:浏览到左侧窗格中的DB和模式(确保序列在文件->首选项->浏览器->节点中可见)。然后选择相关表格的顺序:右键单击->属性。现在在定义->当前值中设置正确的值并保存。可能您需要增加该值。使其比表中所示的最大PK值高1。我还发现,如果我除了重复运行./manage.py migrate之外什么都不做,它最终会起作用。太棒了,这对我很有帮助!