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.
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()
sqlite3.Connection
有一个^{文件规定:
要从
SELECT
返回单个值的列表,例如id
,可以将lambda赋给row_factory
,它返回每行中的第一个索引值;例如:这会产生如下结果:
您还可以直接在游标对象本身上设置
row_factory
。实际上,如果在创建游标之前未在连接上设置row_factory
,则必须在游标上设置row_factory
:在游标对象的生存期内,您可以在任意点重新定义
row_factory
,也可以使用None
取消设置行工厂以返回基于元组的默认结果:你真的不想这么做-你所做的任何事情,沿着使用zip或列表理解的路线,只是吃CPU周期和吸吮内存,而没有增加重要的价值。你最好是处理元组。
至于为什么返回元组,这是因为Python DBD API 2.0需要
fetchall
返回元组。(我之前的建议,
column=zip(*data)[COLUMN]
,如果data
是空元组,则引发一个IndexError
。相反,上面的列表理解只会创建一个空列表。根据你的情况,提出一个IndexError
可能更好,但我将留给你决定。)相关问题 更多 >
编程相关推荐