<p>使用<code>cursor.fetchmany()</code>时,不必发出另一条<code>SELECT</code>语句。光标将跟踪您在结果序列中的位置,您只需再次调用<code>c.fetchmany(100)</code>,直到生成空结果:</p>
<pre><code>c.execute('SELECT words FROM testWords')
while True:
batch = c.fetchmany(100)
if not batch:
break
# each batch contains up to 100 rows
</code></pre>
<p>或使用<a href="https://docs.python.org/3/library/functions.html#iter" rel="noreferrer">^{<cd4>} function</a>(可用于反复调用函数,直到达到sentinel结果):</p>
^{pr2}$
<p>如果不能保持光标不变(例如,因为您正在处理web请求),那么使用<code>cursor.fetchmany()</code>是错误的接口。您将不得不使用<a href="https://sqlite.org/lang_select.html#limitoffset" rel="noreferrer">^{<cd7>} syntax</a>告诉<code>SELECT</code>语句只返回一个选定的行窗口。<code>LIMIT</code>有一个可选的<code>OFFSET</code>关键字,这两个关键字一起指定从哪一行开始以及返回多少行。在</p>
<p>请注意,您需要确保您的<code>SELECT</code>语句是<em>有序的</em>,这样您就可以获得一个稳定的结果集,然后将其分割成多个批。在</p>
<pre><code>batchsize = 1000
offset = 0
while True:
c.execute(
'SELECT words FROM testWords LIMIT ? OFFSET ?',
(batchsize, offset))
batch = list(c)
offset += batchsize
if not batch:
break
</code></pre>
<p>如果您需要将这些批处理发送到其他地方,然后在以后继续时,将<code>offset</code>值传递给对代码的下一个调用。在</p>