我试图了解当顺序处理游标行时以下内置函数如何工作。这些描述来自Python 3.1手册(使用SQLite3)
Cursor.fetchone()
获取查询结果集的下一行,返回单个序列。
Cursor.fetchmany()
获取查询结果的下一组行,并返回一个列表。
Cursor.fetchall()
获取查询结果的所有(剩余)行,并返回一个列表。
因此,如果我有一个循环,其中我使用cursor.fetchone()一次处理一行,而稍后的代码要求我返回第一行,或使用fetchall()提取所有行,该如何做?
这个概念对我来说有点奇怪,特别是来自Foxpro背景,它具有记录指针的概念,可以将记录指针移到光标的第一行或最后一行(转到顶部/底部),或移至第n行(去n)
任何帮助,将不胜感激。
艾伦
Python 3.1中的SQLite接口基于PEP 249,它仅指定游标必须支持对查询结果记录的顺序访问。没有回头路了。如果您需要返回到先前获取的行,则应在首次获取它时将其保存,例如,创建一个获取数据的列表(或者实际上是使用fetchall)。然后,您可以使用列表,并根据需要在行之间来回移动。
fetchall
DB API设计背后的思想是支持高效执行代码,您只需要处理每一行一次即可。一个典型的循环如下所示:
for a,b,c in cursor.fetchone(): # process it
这样,一旦循环的相应迭代完成,游标就可以丢弃对每一行数据的引用。它实际上并不会丢失任何内容,因为如果您要保留所有数据,则始终可以列出其中的一个列表,但是处理大型数据集的应用程序仍然可以一次处理一个行。这有点像在需要逐个处理可迭代元素时使用生成器表达式而不是列表的原因。