Python db api:fetchone vs fetchmany vs fetch

2024-09-27 21:31:01 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我刚和一些同事讨论了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

Tags: nameinfromidforexecutetableresult
3条回答

我认为这确实取决于实现,但是您可以通过查看MySQLdb的源代码来了解这些差异。根据选项的不同,mysqldb fetch*将当前的行集保留在内存或服务器端,因此fetchmany vs fetchone在这里具有一定的灵活性,可以知道在(python的)内存中保留什么,以及在服务器端保留什么。

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*()未生成任何结果集或尚未发出调用,则会引发编程错误。

获取多个([size=cursor.arraysize])

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

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

>>> 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*()未生成任何结果集或尚未发出调用,则会引发编程错误。

相关问题 更多 >

    热门问题