gpt4 book ai didi

Django 独特的批量插入

转载 作者:行者123 更新时间:2023-12-01 15:17:28 25 4
gpt4 key购买 nike

我需要能够快速批量插入大量记录,同时仍确保数据库中的唯一性。要插入的新记录已经被解析,并且是唯一的。我希望有一种方法可以在数据库级别强制执行唯一性,而不是在代码本身。

我使用 MySQL 作为数据库后端。如果 django 在任何其他数据库中支持此功能,我可以灵活地更改后端,因为这是一项要求。

Django 中的批量插入不使用save 方法,那么如何一次插入数百到数千条记录,同时仍然尊重唯一字段和唯一字段?


我的模型结构,经过简化,看起来像这样:

class Example(models.Model):
Meta:
unique_together = (('name', 'number'),)

name = models.CharField(max_length = 50)
number = models.CharField(max_length = 10)
...
fk = models.ForeignKey(OtherModel)

编辑:

数据库中不存在的记录应该被插入,已经存在的记录应该被忽略。

最佳答案

正如 miki725 所提到的,您当前的代码没有问题。我假设您正在使用 bulk_create 方法。使用bulk_create时确实没有调用save()方法,但是在save()方法内部并没有强制字段的唯一性。当您使用 unique_together 时,一个unique constraint会在创建表时添加到 mysql 中的基础表中:

Django :

unique_together = (('name', 'number'),)

MySQL:

UNIQUE KEY `name` (`name`,`number`)

因此,如果您使用任何方法(save、bulk_insert 或什至原始 sql)向表中插入一个值,您将从 mysql 中获得此异常:

Duplicate entry 'value1-value2' for key 'name'

更新:

bulk_insert 所做的是创建一个大查询,该查询一次插入所有数据。因此,如果其中一个条目重复,它会抛出异常并且不会插入任何数据。

1- 一种选择是使用 bulk_insert 的 batch_size 参数并使其将数据插入多个批处理,这样如果其中一个批处理失败,您只会错过该批处理的其余数据。 (取决于插入所有数据的重要性以及重复条目的频率)

2- 另一种选择是在批量数据上编写一个 for 循环并逐个插入批量数据。这样,仅针对该行抛出异常,并插入其余数据。这每次都会查询数据库,当然会慢很多。

3- 第三个选项是解除唯一约束,使用 bulk_create 插入数据,然后编写一个简单的查询来删除重复的行。

关于Django 独特的批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15261821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com