Python sqlite3是否都是必需的?

Python sqlite3是否都是必需的?,python,sql,sqlite,Python,Sql,Sqlite,我刚开始在python中使用sqlite3。 我想知道以下两者之间的区别: cursor = db.execute("SELECT customer FROM table") for row in cursor: print row[0] 及 除了cursor是和cursor.fetchall()是之外,它们都有相同的结果 是否存在差异、偏好或一个比另一个更偏好的特定情况?fetchall()将所有记录读取到内存中,然后返回该列表 在光标本身上迭代时,仅在需

我刚开始在python中使用sqlite3。 我想知道以下两者之间的区别:

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

除了
cursor
cursor.fetchall()
之外,它们都有相同的结果

是否存在差异、偏好或一个比另一个更偏好的特定情况?

fetchall()
将所有记录读取到内存中,然后返回该列表

在光标本身上迭代时,仅在需要时读取行。
当您有很多数据并且可以逐个处理行时,这会更加有效。

主要的区别就是调用
fetchall()
。通过发出
fetchall()
,它将返回一个
列表
对象,其中填充了初始查询中剩余的所有元素(如果您还没有得到任何内容,则返回所有元素)。这有几个缺点:

  • 增加内存使用:将查询的所有元素存储在一个列表中,这个列表可能非常大
  • 性能差:如果有许多元素,则填充列表可能非常慢
  • 进程终止:如果它是一个巨大的查询,那么您的程序可能会因内存不足而崩溃
  • 当您改为使用
    cursor
    迭代器(
    用于游标中的e:
    )时,您会延迟地获取查询的行。这意味着,只有在程序需要时才逐个返回

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


    希望这有帮助

    我认为在运行选择查询时,可以对数据库进行并行写入,这一点很重要。考虑如果要更新正在迭代的某些行,或者如果有另一个进程或线程可以进行这样的更新,则会发生什么。如果在光标本身上进行迭代,查询可能会突然停止返回它应该拥有的行,但如果将所有行都提取到内存中,那么无论是好是坏,您都会在该时间窗口内得到这些行。@davidodford SQLite始终使用;这是不可能发生的。这取决于您所做的每件事是否都使用事务。我还没有真正测试过多线程场景,但在单线程应用程序中,如果您使用光标选择要更新的行列表,并尝试在该循环中更新这些行,则不会更新预期的所有行。如果您获取所有行,这种方法将有效。我自己也没料到这可能是由序列化事务系统引起的,即在游标上迭代期间的事务会更改底层数据,而游标只会吐出它的内脏。
    cursor = db.execute("SELECT customer FROM table")
        for row in cursor.fetchall():
                  print row[0]