<p>通过在游标上调用<code>list()</code>,您耗尽了迭代器,没有留下任何其他东西让您的<code>else</code>分支循环。下面的玩具代码演示了这一点,为了更好地练习,我做了一些修改:</p>
<ol>
<li>我使用了<code>with</code><a href="https://docs.python.org/3/reference/compound_stmts.html#the-with-statement" rel="nofollow noreferrer">context manager</a>,它将为我们处理关闭数据库,即使在发生错误的情况下。在</li>
<li>我已经使用参数化查询来检索值;这将有助于防止SQL注入。在</li>
<li>我已经演示了使用<code>.fetchall()</code>来检索结果。尽管直接在光标上迭代比预先生成整个结果列表更有效,但是除了将结果分配给有意义的名称之外,它允许您多次迭代。在</li>
</ol>
<p>示例:</p>
<pre><code>import sqlite3
with sqlite3.connect(":memory:") as conn: # Using a context manager
c = conn.cursor()
c.execute("""
CREATE TABLE IF NOT EXISTS testing(
some_code INTEGER,
data TEXT)
""")
c.executemany("""
INSERT INTO testing VALUES (?, ?)
""", [[1, 'hi'], [2, 'bye'], [1, 'something']])
# Query the new database using a parameterized query
c.execute("select * from testing where some_code = ?", (1,))
if len(list(c)) > 0: # Exhausts the iterator and then throws the result away
print("Printing result set 1")
for row in c:
print(row)
print("End of result set 1")
print()
# Repeat the query
c.execute("select * from testing where some_code = ?", (1,))
print("Printing result set 2")
for row in c: # iterate the cursor
print(row)
print("End of result set 2")
print()
# And one more time but using fetchall()
c.execute("select * from testing where some_code = ?", (1,))
data = c.fetchall() # Exhaust the iterator but assign a list to a name
print("Printing result set 3")
for row in data:
print(row)
print("End of result set 3")
print()
# And we can keep on printing without re-querying
print("Printing result set 4")
for row in data:
print(row)
print("End of result set 4")
print()
</code></pre>