在使用MySQLdb时,如何使用Python列表理解(或类似)来检索行?
在处理Web服务器时,我经常使用MySQLdb。我经常发现自己在重复台词:在使用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); } 我试着用列表理解法来理解语法,但我
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()的问题是它在一个列表中获取所有,这意味着将整个结果集一次存储在内存中。