Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Database Django 1.4批量创建后主键冲突_Database_Django_Conflict - Fatal编程技术网

Database Django 1.4批量创建后主键冲突

Database Django 1.4批量创建后主键冲突,database,django,conflict,Database,Django,Conflict,我使用的是Django 1.4,数据库是postgresql,我有以下模型: class Keyword(models.Model): name = models.CharField(max_length=100) 我正在用另一个数据库的数据填充django数据库,使用bulk_create, 一些代码类似于: Keyword.objects.bulk_create([Keyword(id=id, name=name) for id,name in [(1,"k1"),(2,"k2")

我使用的是Django 1.4,数据库是postgresql,我有以下模型:

class Keyword(models.Model):
    name = models.CharField(max_length=100)
我正在用另一个数据库的数据填充django数据库,使用bulk_create, 一些代码类似于:

Keyword.objects.bulk_create([Keyword(id=id, name=name) for id,name in [(1,"k1"),(2,"k2"),(3,"k3")] ])
遗留数据已经有了主键,保持这种方式很重要

问题是,当我尝试创建新对象时,Django将使用从1开始的主键,并引发冲突异常:

k = Keyword(name="k4")
k.save()
告诉我错误

IntegrityError: duplicate key value violates unique constraint "sinbiota_keyword_pkey"
DETAIL:  Key (id)=(1) already exists.

有没有办法强制Django以另一个值开始主键递增,或者有没有办法解决此冲突?

您可以通过添加自己的
id
字段并将其标记为主键来覆盖包含自动递增主键的默认模型行为。例如:

 class Keyword(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100) 

Docs:

我通过在Django之外的postgresql的自动增量逻辑中设置下一个id,使用
setval
命令解决了这个问题,类似于问题和

在我的示例中,我必须在psql中执行该命令

select setval('keyword_id_seq', 3); 
其中,
keyword\u id\u seq
是自动递增序列的名称(默认情况下,
\u seq'
),6965是表中的最大id。这样,,
自动递增从下一个id开始(本例中为4),不会发生冲突。

但我认为这意味着我必须创建自己的主键逻辑,这是我不愿意做的事情。我在这里找到了我的解决方案,很快就会发布。