具有UUID primary_key的Django bulk_create IntegrityError(重复条目)

时间:2019-02-04 15:46:51

标签: mysql django

我试图在模型中保存大量对象,所以我决定通过这种方式使用bulk_create:

while True:
    batch = list(islice(records, 100))
    if not batch:
        break
    models.Record.objects.bulk_create(batch, batch_size)

但是当我添加第二批100时出现此错误:

django.db.utils.IntegrityError: (1062, "Duplicate entry '165ab345f2ad47bbb2072ab7b3e8023f' for key 'PRIMARY'")

这是对您有帮助的模型:

class Record(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    ...

谢谢。

1 个答案:

答案 0 :(得分:1)

我相信您的代码每次都会返回相同的切片,因此您会收到完整性错误,因为您已经插入了该特定记录。当前代码是从相同的起始位置开始的。尝试改用标准python切片。

record_list = []
for record in records:
    if len(record_list) % 100 == 0:
        models.Record.objects.bulk_create(record_list, len(record_list))
        record_list = []
    else:
        record_list.append(record)

根据islice文档,您当前的代码将记录的前100个元素(除了前100个元素)全部作为一个分片返回。在此处查看更多信息,https://docs.python.org/3.7/library/itertools.html#itertools.islice