Bulk_create无法与batch_size参数一起使用

时间:2018-10-16 17:41:44

标签: django python-3.x

我正在尝试使用bulk_create,但它仅创建一个对象,而不是我规定的batch_size。我为batch_size使用了一个变量,所以也许是问题所在,但我想不出为什么它应该是个问题。这是代码:

12,152,832
17,539,072
17,924,096  # At this point, the original code was above 18.8M bytes
17,965,056
17,965,056  # At this point, the original code was above 21.7M bytes
... remains unchanged until end of program if gc.collect() called regularly ...

我也尝试过:

Tk

也不起作用。

1 个答案:

答案 0 :(得分:2)

.bulk_create [Django-doc]将对象的列表存储到数据库中。 batch_size用于确定每个查询 中数据库中存储了多少个对象。

例如,如果您有一个包含100个元素的列表,而batch_size=10则将导致10个查询,如果batch_size=25则将导致4个查询(假设查询时间不太长)。或按照文档中的说明:

  

此方法将提供的对象列表插入数据库   以高效的方式(通常只有1个查询,无论有多少个   有物体)。

因此batch_size参数仅用于“限制”每个查询存储的元素数量,对于某些数据库系统,最好使用多个查询,例如仍可访问该表在进行大量插入时。

但是,在这里,您仅给该函数一个一个元素的列表,因此无论batch_size,您都可以创建一个包含20个ModelT的列表:< / p>

objs1 = [
    ModelT(name=instance.name, author=instance.author, content=instance.content)
    for _ in range(20)
]

ModelT.objects.bulk_create(objs1)

如果所有对象具有相同的内容,我们甚至可以乘以一个数字:

objs1 = [
    ModelT(name=instance.name, author=instance.author, content=instance.content)
] * 20

ModelT.objects.bulk_create(objs1)

请注意,如文档中所述,不会触发pre_savepost_save信号,并且除非数据库后端是PostgreSQL,否则对象的id不是 设置(对于后一种方法,它将不起作用,因为在这里我们构造了一个列表,其中包含对 same 对象的20个引用)。

您仍可以在上面指定的语义下指定batch_size,但这不会使功能有所不同。