5

我试图了解以下内置函数在顺序处理游标行时如何工作。描述来自 Python 3.1 手册(使用 SQLite3)

Cursor.fetchone()

获取查询结果集的下一行,返回单个序列。

Cursor.fetchmany()

获取查询结果的下一组行,返回一个列表。

Cursor.fetchall()

获取查询结果的所有(剩余)行,返回一个列表。

因此,如果我有一个循环,其中我使用 cursor.fetchone() 一次处理一行,而后来的一些代码要求我返回第一行,或者使用 fetchall() 获取所有行,我该怎么做?

这个概念对我来说有点奇怪,特别是来自 Foxpro 背景,它有一个记录指针的概念,它可以移动到光标中的第一行或最后一行(转到顶部/底部),或者转到第 n 行(去 n)

任何帮助,将不胜感激。

艾伦

4

1 回答 1

9

Python 3.1 中的 SQLite 接口基于PEP 249,它仅指定游标必须支持对查询结果记录的顺序访问。没有办法回去了。如果您需要返回之前获取的行,您应该在第一次获取时保存它,例如创建一个获取数据的列表(或者实际上,只需使用fetchall)。然后,您可以使用列表并在行之间来回走动。

DB API 设计背后的想法是支持代码的高效执行,您只需处理每一行一次。一个典型的循环如下所示:

for a,b,c in cursor.fetchone():
    # process it

这样,一旦相应的循环迭代完成,游标就可以丢弃对每一行数据的引用。它并没有真正丢失任何东西,因为如果您想保留所有数据,您总是可以从中列出一个列表,但是处理大型数据集的应用程序仍然能够一次处理一个行。当您需要一个一个地处理可迭代的元素时,这有点像使用生成器表达式而不是列表背后的推理。

于 2010-05-09T04:19:47.363 回答