【问题标题】:Navigating cursor rows in SQLite (Can we rewind/reset the cursor i.e. go back to first row for example?)在 SQLite 中导航游标行(例如,我们可以回退/重置游标,即返回第一行吗?)
【发布时间】:2010-05-09 03:35:48
【问题描述】:

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

Cursor.fetchone()

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

Cursor.fetchmany()

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

Cursor.fetchall()

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

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

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

任何帮助将不胜感激。

艾伦

【问题讨论】:

  • 还有一个选项:for row in Cursor,我猜是Cursor.fetchall()的生成器

标签: python sqlite fetch


【解决方案1】:

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

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

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

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

【讨论】:

  • 大卫,感谢您的解释。现在开始有意义了。问候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多