【问题标题】:How to use Python list comprehension (or such) for retrieving rows when using MySQLdb?使用 MySQLdb 时如何使用 Python 列表理解(或此类)来检索行?
【发布时间】:2010-04-15 22:41:34
【问题描述】:

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

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

不知何故,这让我觉得有点不像 Python。有没有更好的单行方式来完成同样的事情,就像 C 中的内联赋值一样:

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

我尝试过使用列表推导来弄清楚语法,但我似乎无法弄清楚。有什么建议吗?

谢谢,

埃里克

【问题讨论】:

    标签: python coding-style mysql


    【解决方案1】:

    实际上并没有办法让列表理解参与其中。您需要一个在返回哨兵值时终止的循环。幸运的是,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)
    

    这显然是最漂亮的解决方案,如果可用的话:)

    【讨论】:

      【解决方案2】:

      MySQLdb 游标是可迭代的:

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

      【讨论】:

        【解决方案3】:

        怎么样:

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

        【讨论】:

        • cursor.fetchall() 的问题在于它在一个列表中获取所有结果,这意味着一次将整个结果集放在内存中。
        【解决方案4】:

        SQLalchemy 有一系列方法,可以为您的大量用例提供更多的 Pythonic 构造 - 包括生成在数据库访问中“惰性”的可迭代对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-03
          • 2023-03-04
          • 1970-01-01
          • 2016-11-17
          • 2015-10-06
          • 1970-01-01
          • 2014-08-20
          • 2019-05-10
          相关资源
          最近更新 更多