擅长:python、mysql、java
<p>假设“c”是一个游标,则代码还有一个严重问题。SQLite游标一次获得一个结果行(即每次通过for循环),而不是提前获得所有结果行。如果重用游标,则它将用新的查询替换当前查询。例如,此代码只在循环中运行一次:</p>
<pre><code>for row in c.execute("select * from score"):
for dummy in c.execute("select 3"):
print row, dummy
</code></pre>
<p>您的解决方案包括:</p>
<ul>
<li><p>在结尾处添加.fetchall():c.execute(“select*from score”).fetchall(),它一次获取前面的所有行,而不是一行。</p></li>
<li><p>使用不同的光标,这样每个光标之间的迭代不会影响其他光标</p></li>
<li><p>创建一个新的游标-将c.execute(“…”)替换为conn.cursor().execute(“…”)
pysqlite的最新版本允许您执行conn.execute(“…”),这实际上是在幕后执行上述操作。</p></li>
</ul>
<p>光标是非常便宜的,所以不要试图保存它们-使用尽可能多-你不会有这样的错误。</p>
<p>一般来说,非常小心地重用迭代器和修改在同一系列循环中迭代的内容也是一个好主意。不同的类以不同的方式表现,所以最好假设它们不喜欢它,除非另有说明。</p>