今天我刚和一些同事讨论了python的db api fetchone vs fetchmany vs fetchall。
我确信每个用例都依赖于我正在使用的db api的实现,但是一般来说,fetchone vs fetchmany vs fetchall的用例是什么?
换言之,以下是等价物吗?还是有一个比其他人更受欢迎?如果是,在什么情况下?
cursor.execute("SELECT id, name FROM `table`")
for i in xrange(cursor.rowcount):
id, name = cursor.fetchone()
print id, name
cursor.execute("SELECT id, name FROM `table`")
result = cursor.fetchmany()
while result:
for id, name in result:
print id, name
result = cursor.fetchmany()
cursor.execute("SELECT id, name FROM `table`")
for id, name in cursor.fetchall():
print id, name
我认为这确实取决于实现,但是您可以通过查看MySQLdb的源代码来了解这些差异。根据选项的不同,mysqldb fetch*将当前的行集保留在内存或服务器端,因此fetchmany vs fetchone在这里具有一定的灵活性,可以知道在(python的)内存中保留什么,以及在服务器端保留什么。
PEP 249没有给出太多细节,所以我想这是为了在实现定义了精确语义的情况下,根据数据库优化事情。
这些都是特定于实现的。
将从表中获取所有结果。当桌子的尺寸很小的时候,这个效果会更好。如果表的大小更大,在这种情况下fetchall将失败。
将使用大部分内存。
如果查询是在网络上完成的,则会导致一些问题。
fetchmany将只获得所需数量的结果。你可以得到结果和过程。fetchmany实现的简单片段。
fetchone()
获取查询结果集的下一行,返回一个元组,或者在没有更多可用数据时不返回元组:
如果上一次调用execute*()未生成任何结果集或尚未发出调用,则会引发编程错误。
获取多个([size=cursor.arraysize])
获取查询结果的下一组行,返回元组列表。当没有更多行可用时返回空列表。
每个调用要获取的行数由参数指定。如果未给定,则光标的arraysize将确定要提取的行数。该方法应尝试获取由size参数指示的尽可能多的行。如果由于指定的行数不可用而无法执行此操作,则返回的行数可能会减少:
如果上一次调用execute*()未生成任何结果集或尚未发出调用,则会引发编程错误。
注意,size参数涉及性能方面的考虑。为了获得最佳性能,通常最好使用arraysize属性。如果使用了size参数,那么它最好在一个fetchmany()调用到下一个调用时保留相同的值。
列表项
fetchall()
获取查询结果的所有(剩余)行,将它们作为元组列表返回。如果没有要提取的记录,则返回空列表。
如果上一次调用execute*()未生成任何结果集或尚未发出调用,则会引发编程错误。
相关问题 更多 >
编程相关推荐