Python db-api: fetchone vs fetchmany vs fetchall

6 浏览
0 Comments

Python db-api: fetchone vs fetchmany vs fetchall

今天我和我的一些同事讨论了Python的db-api: fetchone,fetchmany和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

admin 更改状态以发布 2023年5月22日
0
0 Comments

我认为这确实取决于实现方式,但是您可以通过查看MySQLdb源代码来了解差异的一些想法。根据选项,mysqldb fetch*会在内存或服务器端保留当前的一组行,因此fetchmany相对于fetchone在此具有一定的灵活性,以了解在(Python的)内存中保留什么,以及在数据库服务器端保留什么。

PEP 249没有给出太多细节,因此我认为这是根据数据库优化事物的具体语义是实现定义的。

0
0 Comments

根据官方的psycopg2文档

fetchone()

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

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

如果上一次的execute*()调用没有产生任何结果集或尚未发起调用,则会引发ProgrammingError。

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*()调用没有产生任何结果集或尚未发起调用,则会引发ProgrammingError。

请注意,大小参数涉及性能考虑。为了实现最佳性能,通常最好使用数组大小属性。如果使用大小参数,则最好将其保留在从一个fetchmany()调用到下一个fetchmany()调用时具有相同的值。

列表项

fetchall()

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

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

如果上一次的execute*()调用没有产生任何结果集或尚未发起调用,则会引发ProgrammingError。

0