<p><code>sqlite3.Connection</code>有一个<a href="https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.row_factory" rel="nofollow noreferrer">^{<cd2>}</a>属性。</p>
<p>文件规定:</p>
<blockquote>
<p>You can change this attribute to a callable that accepts the cursor and the original row as a tuple and will return the real result row. This way, you can implement more advanced ways of returning results, such as returning an object that can also access columns by name.</p>
</blockquote>
<p>要从<code>SELECT</code>返回单个值的列表,例如<code>id</code>,可以将lambda赋给<code>row_factory</code>,它返回每行中的第一个索引值;例如:</p>
<pre class="lang-py prettyprint-override"><code>import sqlite3 as db
conn = db.connect('my.db')
conn.row_factory = lambda cursor, row: row[0]
c = conn.cursor()
ids = c.execute('SELECT id FROM users').fetchall()
</code></pre>
<p>这会产生如下结果:</p>
<pre><code>[1, 2, 3, 4, 5, 6] # etc.
</code></pre>
<p>您还可以直接在游标对象本身上设置<code>row_factory</code>。实际上,如果在创建游标之前未在连接上设置<code>row_factory</code>,则必须在游标上设置<code>row_factory</code>:</p>
<pre class="lang-py prettyprint-override"><code>c = conn.cursor()
c.row_factory = lambda cursor, row: {'foo': row[0]}
</code></pre>
<p>在游标对象的生存期内,您可以在任意点重新定义<code>row_factory</code>,也可以使用<code>None</code>取消设置行工厂以返回基于元组的默认结果:</p>
<pre class="lang-py prettyprint-override"><code>c.row_factory = None
c.execute('SELECT id FROM users').fetchall() # [(1,), (2,), (3,)] etc.
</code></pre>