24

遇到了一点问题,当我运行“python manage.py syncdb我正在一个相当旧的站点上工作”时,我收到了上述错误消息。它使用 postgres 数据库运行 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

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

谢谢!

4

5 回答 5

62

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

在 Postgres 中执行这个可以解决问题吗?

SELECT setval('django_content_type_id_seq', (SELECT MAX(id) FROM django_content_type));
于 2013-10-02T11:48:43.910 回答
19

这通常意味着您的主键序列已不同步。这可能是由于迁移不当等造成的。
要解决此问题;
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;

于 2016-01-07T07:01:32.573 回答
4

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

python manage.py dbshell

检查下表的当前值

SELECT last_value FROM django_migrations_id_seq;
SELECT last_value FROM django_content_type_id_seq;

然后使用下面的命令更新它们(任何大于上面输出的合理值)。通常,第一个命令就足够了,但是如果您仍然遇到键值错误违反唯一约束“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};

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

SELECT last_value FROM auth_permission_id_seq;

将值增加一

ALTER SEQUENCE auth_permission_id_seq RESTART WITH {value_greater_than_last_value};
于 2020-07-30T10:18:46.173 回答
2

我收到了这个错误:

django.db.utils.IntegrityError: duplicate key value violates unique constraint 
    "blahmodule_blahthing_blahstuff_id"
DETAIL:  Key (blahstuff_id)=(1) already exists.

一个可能的解决方案:

  • 尝试将blahstuff关系blahthingOneToOneField字段迁移到ForeignKey

对我使用的解释:

我正在使用 Django RestFramework,它通过 aListCreateAPIView和 a连接起来ModelSerializer。无论出于何种原因,OneToOneField将 a 附加UNIQUE到其中一个连接表blahmodule_blahthing_blahstuff_id,(我实际上不确定它是否是一个连接表,这是一个假设),但无论 django 切换到带有 QuerySet 返回的 ForeignKey 发生了什么魔法,都解决了我的问题.

有关的:

至于上面的实际问题:

架构:

-- 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_content_type_app_label_model_76bd3d3b_uniq和主键可能会变得混乱。

于 2018-12-11T07:10:15.750 回答
1

受 Wolph 的启发,这是我的解决方案。

SELECT setval('django_migrations_id_seq', (SELECT MAX(id) FROM django_migrations));
于 2019-10-18T03:22:48.290 回答