Skip to main content
 首页 » 编程设计

python之控制数据库查询流程的更好方法

2025年05月04日12me-sa

在我的程序中,我需要读取一个非常大的表(它超出了内存存储空间)并让我自己编写以下结构来从表中读取数据并做一些工作。虽然我知道很有可能将选择重写为迭代器样式,但它仍然具有以下基本结构:

    found = True 
    start = 0 
    batch = 2500 
    while found: 
        found = False 
        for obj in Channel.select().limit(batch).offset(start): 
            found = True 
 
            # do some big work... 
 
        start += batch 

我想做的是有一些东西不会携带那么多笨拙的状态变量。关于如何清理这一点困惑的想法?

仅供引用 - 我也尝试过这个,但不确定我是否更喜欢它:

@staticmethod 
def qiter(q, start=0, batch=25000): 
    obj = True 
    while obj: 
        for obj in q.limit(batch).offset(start): 
            yield obj 
        start += batch 

请您参考如下方法:

我发现的最短的事情如下:

for start in itertools.count(0, 2500): 
    objs = Channel.select().limit(2500).offset(start) 
    if not objs: 
        break 
    for obj in objs: 
        # do some big work... 

基本上它是两件事的结合:

  • count 迭代器(来自标准库的 itertools 包)将批处理计数减少到最低限度,并且
  • 使用单独的测试和 break 语句来摆脱它。

详细说明:

count 迭代器非常简单:它产生无限系列 0, 2500, 5000, 7500, ... 。因为这个循环永远不会结束,所以我们需要在某个地方break。这就是 if 语句发挥作用的地方。如果 objs 是一个空列表,则 break 存在于外循环。