这是问题。
我想使用Django的bulk_create
一次保存更多数据。但是我从API获得的原始结果是其中包含数量数据的生成器。所以我想循环使用此生成器并批量保存数据。
我的审判如下:
# a generator with amount data
l = (
item for item in range(1,100230, 1)
)
# base model table
class ModelDemo(models.Model):
...
# main logic code
limit = 2000
while l:
bulk_list = []
for index, item in enumerate(l):
bulk_list.append(
ModelDemo(
...
)
)
if index == limit:
ModelDemo.objects.bulk_create(bulk_list)
break
很明显,我会丢失最后的230
数据,但现在找不到解决方案。
任何评论都非常受欢迎。非常感谢。
答案 0 :(得分:1)
这可能有效。
例如:
from itertools import chain, islice
l = (
item for item in range(1,10230, 1)
)
limit = 2000
def chunks(iterable, size=10):
iterator = iter(iterable)
for first in iterator:
yield chain([first], islice(iterator, size - 1))
data = chunks(l, limit)
while data:
try:
bulk_list = []
for index, item in enumerate(next(data)):
bulk_list.append(
ModelDemo(
...
)
)
ModelDemo.objects.bulk_create(bulk_list)
except:
break
答案 1 :(得分:0)
啊!我现在知道您的问题是什么。
您需要做的就是在循环终止后处理最后的清单,该清单太大了。
limit = 2000
bulk_list = []
for index, item in enumerate(l):
bulk_list.append(
ModelDemo(
...
)
)
if index == limit:
ModelDemo.objects.bulk_create(bulk_list)
bulk_list.clear() # reset the batch
ModelDemo.objects.bulk_create(bulk_list)
我不确定while循环是干什么用的。而且你不应该休息。