关于MySQL游标和迭代器

24 投票
1 回答
20828 浏览
提问于 2025-04-16 18:44

假设我有一个MySQL的游标和读取的数据。这些数据可能非常庞大,所以我想每次只处理一行。

一种简单直接的方法可能是这样的:

while True:
    row = cursor.fetchone()
    if not row: break
    .....

但是这样看起来不太好,所以我想知道这种方法是否能如我所想的那样工作:

for row in iter(cursor.fetchall())

我想知道的是:如果我使用 iter(cursor.fetchall()) 这种方式,它是先把所有数据都取出来,还是每次只取一行?

1 个回答

49

MySQLdb 的游标类实现了一个叫做迭代器协议的东西,这样你就可以很简单地做到这一点:

cursor.execute(sql)
for row in cursor:
    print row
    ...

以下是来自 MySQLdb.cursors.BaseCursor 的相关代码:

def __iter__(self):
    return iter(self.fetchone, None)

撰写回答