我刚开始使用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'>
外,两者都有相同的结果。
是否存在差异,偏好或特定情况,其中一个比另一个更优选?
答案 0 :(得分:9)
fetchall()
将所有记录读入内存,然后返回该列表。
当迭代光标本身时,只在需要时才读取行。 当您拥有大量数据并且可以逐个处理行时,这会更有效。
答案 1 :(得分:4)
主要区别恰恰是对fetchall()
的调用。通过发出fetchall()
,它将返回一个list
对象,其中包含初始查询中剩余的所有元素(如果尚未获得任何内容,则返回所有元素)。这有几个缺点:
当您改为使用cursor
迭代器(for e in cursor:
)时,您会得到查询的行 lazily 。这意味着,只有在程序需要时才逐个返回。
当然,您的两个代码段的输出是相同的,但在内部使用fetchall()
与仅使用cursor
之间存在巨大的性能缺陷。
希望这有帮助!