在SQLite中导航光标行(我们可以倒回/重置光标,比如回到第一行吗?)

6 投票
1 回答
9690 浏览
提问于 2025-04-15 22:30

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

Cursor.fetchone()

这个函数会获取查询结果集中的下一行,并返回一个单独的序列。

Cursor.fetchmany()

这个函数会获取查询结果中的下一组行,并返回一个列表。

Cursor.fetchall()

这个函数会获取查询结果中所有剩余的行,并返回一个列表。

所以,如果我有一个循环,使用cursor.fetchone()逐行处理数据,而后面的代码需要我返回到第一行,或者使用fetchall()获取所有行,我该怎么做呢?

这个概念对我来说有点奇怪,特别是我之前用过Foxpro,它有一个记录指针,可以移动到游标的第一行或最后一行(去顶部/底部),或者直接跳到第n行(去n)。

任何帮助都将不胜感激。

艾伦

1 个回答

10

在Python 3.1中,SQLite的接口是基于PEP 249的,这个规范只规定了游标(cursor)必须支持顺序访问查询结果的记录。也就是说,你不能随意回到之前的数据行。如果你需要返回到之前获取的某一行数据,最好在第一次获取时就把它保存下来,比如创建一个包含获取数据的列表(其实可以直接用fetchall)。这样你就可以在这个列表中随意来回查看数据行了。

这个数据库API的设计理念是支持高效执行代码,通常情况下你只需要处理每一行数据一次。一个典型的循环结构是这样的:

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

这样一来,游标在完成每次循环后就可以丢弃对每一行数据的引用。其实并没有损失什么,因为如果你想保留所有数据,可以随时把它们放进一个列表里。但对于处理大数据集的应用来说,仍然可以逐行处理数据。这就像在需要逐个处理可迭代对象的元素时,使用生成器表达式而不是列表的道理。

撰写回答