在使用MySQLdb时,如何使用Python列表理解(或类似)来检索行?

在使用MySQLdb时,如何使用Python列表理解(或类似)来检索行?,python,coding-style,mysql,Python,Coding Style,Mysql,在处理Web服务器时,我经常使用MySQLdb。我经常发现自己在重复台词: row = cursor.fetchone() while row: do_processing(row) row = cursor.fetchone() 不知怎的,这让我觉得有点不像蟒蛇。有没有更好的,一行的方法来完成同样的事情,就像C中的内联赋值一样: while (row = do_fetch()) { do_processing(row); } 我试着用列表理解法来理解语法,但我

在处理Web服务器时,我经常使用MySQLdb。我经常发现自己在重复台词:

row = cursor.fetchone()
while row:
    do_processing(row)
    row = cursor.fetchone()
不知怎的,这让我觉得有点不像蟒蛇。有没有更好的,一行的方法来完成同样的事情,就像C中的内联赋值一样:

while (row = do_fetch()) { 
    do_processing(row); 
} 
我试着用列表理解法来理解语法,但我似乎无法理解。有什么建议吗

谢谢


埃里克

实际上没有一种方法可以让列表理解参与其中。您需要一个在返回sentinel值时终止的循环。幸运的是,Python确实提供了以下功能:

for row in iter(cursor.fetchone, None):
    process(row)
两个参数
iter()。这是一个有点等温线,因此如果您使用更常见的:

while True:
    row = cursor.fetchone()
    if row is None:
        break
    process(row)
(事实上,在我们推广迭代之前,这种风格甚至在逐行读取文件时都很常见。)

一些DB-API模块(显然现在包括MySQLdb)也使游标直接可写,如下所示:

for row in cursor:
    process(row)
这显然是最漂亮的解决方案,如果有的话:)

那么:

for row in cursor.fetchall():
    # do something with row

MySQLdb游标是可移植的:

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

有一组方法可以为大量的用例提供更多的python构造,包括生成在数据库访问中“懒惰”的iterables。

cursor.fetchall()的问题是它在一个列表中获取所有,这意味着将整个结果集一次存储在内存中。