是否需要sqlite3 fetchall?

时间:2014-01-24 14:10:23

标签: python sql sqlite

我刚开始使用sqlite3和python。 我想知道之间的区别:

cursor = db.execute("SELECT customer FROM table")
    for row in cursor:
              print row[0]

cursor = db.execute("SELECT customer FROM table")
    for row in cursor.fetchall():
              print row[0]

cursor<type 'sqlite3.Cursor'>cursor.fetchall()<type 'list'>外,两者都有相同的结果。

是否存在差异,偏好或特定情况,其中一个比另一个更优选?

2 个答案:

答案 0 :(得分:9)

fetchall()将所有记录读入内存,然后返回该列表。

当迭代光标本身时,只在需要时才读取行。 当您拥有大量数据并且可以逐个处理行时,这会更有效。

答案 1 :(得分:4)

主要区别恰恰是对fetchall()的调用。通过发出fetchall(),它将返回一个list对象,其中包含初始查询中剩余的所有元素(如果尚未获得任何内容,则返回所有元素)。这有几个缺点:

  1. 增加内存使用量:将所有查询的元素存储在列表中,这可能是巨大的
  2. 性能不佳:如果有很多元素,填写列表可能会非常慢
  3. 进程终止:如果是巨大查询,那么程序可能因内存不足而崩溃。
  4. 当您改为使用cursor迭代器(for e in cursor:)时,您会得到查询的行 lazily 。这意味着,只有在程序需要时才逐个返回。

    当然,您的两个代码段的输出是相同的,但在内部使用fetchall()与仅使用cursor之间存在巨大的性能缺陷。

    希望这有帮助!