2014-01-24 122 views
1

我刚开始在python中使用sqlite3。 我想知道的区别:除cursor是sqlite3 fetchall必要的吗?

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] 

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

是否有区别,偏好或特定情况下哪一个比另一个更优先?

回答

5

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

在遍历游标本身时,仅在需要时读取行。 当你有很多数据并且可以逐一处理行时,这会更有效率。

1

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

  1. 增量内存使用:通过存储在列表中,这可能是巨大的所有查询的元素
  2. 糟糕的表现:填充列表可以是如果有许多元素很慢
  3. 进程终止:如果它是一个巨大的查询,那么你的程序可能会因内存不足而崩溃。

当你改用cursor迭代器(for e in cursor:)你查询的行懒洋洋地。这意味着,只有在程序需要时才一一返回。

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

希望这会有所帮助!