3

我正在使用 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 以另一个值开始主键增量,或者有什么方法可以解决这个冲突?

4

2 回答 2

6

我通过使用命令在 Django 之外的 postgresql 的自动增量逻辑中设置下一个 id 来解决这个问题setval,类似于Postgresql setting next id to write toHow to reset postgres' primary key sequence when it fall out of sync 的问题? .

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

select setval('keyword_id_seq', 3); 

其中keyword_id_seq是自增序列的名称(默认为<table_name>_<column_name>_seq'),6965 是表中存在的最大 id。这样,自动增量从下一个 id(在本例中为 4)开始,不会发生冲突。

于 2013-01-09T19:21:21.643 回答
2

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

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

文档:自动主键

于 2013-01-08T22:18:26.103 回答