在这种情况下,如何循环发电机?

2024-09-27 23:26:01 发布

您现在位置:Python中文网/ 问答频道 /正文

问题来了

我想使用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数据,但我现在找不到解决方案

欢迎任何评论。太好了,谢谢


Tags: 数据djangoinapiforindexcreatewith
2条回答

这可能有用

例如:

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

Reference

啊!我现在明白你的问题了

您只需在循环终止后进行最后一个bulk\u create调用,以处理太小的最终列表

主逻辑码

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循环是用来做什么的。你不应该打破

相关问题 更多 >

    热门问题