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

标签 python loops peewee

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

    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 存在于外循环。

关于python - 控制数据库查询流程的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14837977/

相关文章:

c++ - C++ 中循环的替代方案

Python:导入 * 只从包中导入某些东西?

python - Keras 在达到训练后保存最佳模型

python - 随机陈述询问相同的陈述? Python

C# 循环、SQL 和检索信息

python-3.x - peewee可以新建一个MySQL数据库吗

mysql - 使用 peewee 和 pymysql 设置 'charset=utf8' 时出现问题

mysql - 如何使用 Peewee 将 Jupyter Notebook 连接到远程 MySQL 数据库?

python - Django Forms - 多对多关系

python - 带点的函数参数给出 SyntaxError