Python db api:fetchone vs fetchmany vs fetchall

Python db api:fetchone vs fetchmany vs fetchall,python,mysql,python-db-api,Python,Mysql,Python Db Api,我今天刚刚和一些同事讨论了python的db api fetchone vs fetchmany vs fetchall 我确信每一个的用例都依赖于我正在使用的db api的实现,但是一般来说,fetchone与fetchmany与fetchall的用例是什么 换言之,以下是否等效?还是有一个比其他的更受欢迎?如果是,在哪些情况下 cursor.execute("SELECT id, name FROM `table`") for i in xrange(cursor.rowcount):

我今天刚刚和一些同事讨论了python的db api fetchone vs fetchmany vs fetchall

我确信每一个的用例都依赖于我正在使用的db api的实现,但是一般来说,fetchone与fetchmany与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的)内存中保留什么以及在db服务器端保留什么


PEP 249没有给出太多的细节,所以我想这是根据数据库进行优化,而精确的语义是由实现定义的。

这些是特定于实现的

  • 费考尔
将从表中获取所有结果。这将更好地工作时,表的大小较小。如果表的大小更大,在这些情况下fetchall将失败

将使用大部分内存

如果查询是在网络上完成的,则可能会出现一些问题

  • 吸引许多
fetchmany将只获得所需数量的结果。您可以生成结果和过程。fetchmany实现的简单片段

   while True:
    results = cursor.fetchmany(arraysize)
    if not results:
        break
    for result in results:
        yield result
fetchone()

获取查询结果集的下一行,返回单个元组,或者在没有更多数据可用时不返回元组:

>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,))
>>> cur.fetchone()

(3, 42, 'bar')
如果对execute*()的上一次调用未生成任何结果集或尚未发出任何调用,则会引发编程错误

fetchmany([size=cursor.arraysize])

获取查询结果的下一组行,返回元组列表。当没有更多行可用时,将返回空列表

每次调用要获取的行数由参数指定。如果未指定,则光标的arraysize将确定要提取的行数。该方法应尝试获取大小参数指示的尽可能多的行。如果由于指定的行数不可用而无法执行此操作,则可能会返回较少的行:

>>> cur.execute("SELECT * FROM test;")
>>> cur.fetchmany(2)
[(1, 100, "abc'def"), (2, None, 'dada')]
>>> cur.fetchmany(2)
[(3, 42, 'bar')]
>>> cur.fetchmany(2)
[]
如果对execute*()的上一次调用未生成任何结果集或尚未发出任何调用,则会引发编程错误

注意,size参数涉及到性能方面的考虑。为了获得最佳性能,通常最好使用arraysize属性。如果使用了size参数,则最好在一次fetchmany()调用到下一次调用时保留相同的值

列表项

fetchall()

获取查询结果的所有(剩余)行,并将它们作为元组列表返回。如果没有更多记录可获取,则返回空列表

>>> cur.execute("SELECT * FROM test;")
>>> cur.fetchall()
[(1, 100, "abc'def"), (2, None, 'dada'), (3, 42, 'bar')]

如果上一次调用execute*()未生成任何结果集或尚未发出任何调用,则会引发编程错误。

我发现这些调用使用的内存量有所不同,而fetchall()使用的内存最多。这三个fetch命令也让我摸不着头脑。如果所讨论的Python与mySQL服务器在同一台服务器上运行会怎样?我的困惑源于这样一个事实,即SQL select查询可能有
限制
,因此
fetchone
fetchmany
的目的是什么?事实上,如果您选择了一个没有限制的查询,您将得到整个表。如果我仍然只使用
fetchone
,这是否意味着大量的行无缘无故地从服务器传输到客户端?在这种情况下,为什么在使用
LIMIT 1
时使用
fetchone
总是更有效。从Python 3.3开始,使用
yield from results
消除for循环应该更好。@ebk source or explaution?@khawabonga Check and out。