Python sqlite3是否都是必需的?
我刚开始在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()将所有记录读取到内存中,然后返回该列表 在光标本身上迭代时,仅在需
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]