如何在使用MySQLdb时用Python列表推导式获取行?

2 投票
4 回答
579 浏览
提问于 2025-04-15 21:40

我在处理我的网络服务器时,经常使用 MySQLdb。常常需要重复写以下几行代码:

row = cursor.fetchone()
while row:
    do_processing(row)
    row = cursor.fetchone()

这让我觉得有点不够“Python 风格”。有没有更好的一行代码的方法来实现同样的功能,就像 C 语言中的内联赋值那样:

while (row = do_fetch()) { 
    do_processing(row); 
} 

我试着用列表推导式来搞清楚语法,但总是弄不明白。有啥推荐的方法吗?

谢谢,

Erik

4 个回答

0

SQLalchemy 有很多方法,可以让你用更符合 Python 风格的方式来处理许多常见的情况——其中包括生成一些“懒惰”的可迭代对象,这些对象在访问数据库时不会立即获取所有数据。

2

MySQLdb 的游标是可以被遍历的:

cursor.execute(sql,args)
for row in cursor:
    do_processing(row)
3

其实在这个问题上,列表推导式并不适用。你需要一个循环,这个循环会在遇到特定的值时停止。幸运的是,Python确实提供了这样的功能:

for row in iter(cursor.fetchone, None):
    process(row)

这个有两个参数的 iter() 函数需要一个可调用的对象和一个终止值。当遇到这个终止值时,循环就会停止。虽然这个用法有点小复杂,但其实很少有人会抱怨你使用更常见的方式:

while True:
    row = cursor.fetchone()
    if row is None:
        break
    process(row)

实际上,在我们有了更通用的迭代方式之前,这种写法在逐行读取文件时也很常见。

一些数据库API模块(比如现在的MySQLdb)也让游标可以直接进行迭代,像这样:

for row in cursor:
    process(row)

显然,这种方法是最优雅的解决方案,前提是它可用 :)

撰写回答