我正在使用 Django 1.4,以 postgresql 作为数据库,我有以下模型:
class Keyword(models.Model):
name = models.CharField(max_length=100)
我正在使用 bulk_create 使用来自另一个数据库的数据填充 django 数据库, 一些代码类似于:
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从另一个值开始主键增量,或者有什么办法可以解决这个冲突?
最佳答案
我通过在 Django 之外的 postgresql 的自动递增逻辑中使用 setval
设置下一个 id 来解决这个问题。命令,类似于问题Postgresql setting next id to write to和 How to reset postgres' primary key sequence when it falls out of sync? .
在我的示例中,我必须在 psql 中执行命令
select setval('keyword_id_seq', 3);
哪里keyword_id_seq
是自动递增序列的名称(默认为 <table_name>_<column_name>_seq'
),6965 是表中存在的最大 ID。那样,
自增从下一个 id 开始(在本例中为 4),不会发生冲突。
关于database - bulk_create 后 Django 1.4 主键冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14224908/