如何在使用MySQLdb时用Python列表推导式获取行?
我在处理我的网络服务器时,经常使用 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)
显然,这种方法是最优雅的解决方案,前提是它可用 :)