Database Django 1.4批量创建后主键冲突
我使用的是Django 1.4,数据库是postgresql,我有以下模型: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")
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),不会发生冲突。但我认为这意味着我必须创建自己的主键逻辑,这是我不愿意做的事情。我在这里找到了我的解决方案,很快就会发布。