我在python 2.5中使用sqlite3.我创建了一个如下所示的表:
create table votes ( bill text, senator_id text, vote text)
我用这样的东西访问它:
v_cur.execute("select * from votes") row = v_cur.fetchone() bill = row[0] senator_id = row[1] vote = row[2]
我希望能够做的是让fetchone(或其他一些方法)返回一个字典,而不是一个列表,这样我就可以通过名称而不是位置来引用字段.例如:
bill = row['bill'] senator_id = row['senator_id'] vote = row['vote']
我知道你可以用MySQL做到这一点,但是有谁知道如何用SQLite做到这一点?
谢谢!!!
在sqlite3中实际上有一个选项.row_factory
将连接对象的成员更改为sqlite3.Row
:
conn = sqlite3.connect('db', row_factory=sqlite3.Row)
要么
conn.row_factory = sqlite3.Row
这将允许您按名称(字典样式)或索引访问行元素.这比创建自己的解决方案更有效.
我过去这样做的方式:
def dict_factory(cursor, row): d = {} for idx,col in enumerate(cursor.description): d[col[0]] = row[idx] return d
然后在连接中进行设置:
from pysqlite2 import dbapi2 as sqlite conn = sqlite.connect(...) conn.row_factory = dict_factory
这适用于pysqlite-2.4.1和python 2.5.4.
我最近在使用sqlite3.Row()时尝试做类似的事情.虽然sqlite3.Row()非常适合提供类似字典的接口或类似接口的元组,但是当我使用**kwargs在行中传输它时它不起作用.因此,需要一种快速将其转换为字典的方法.我意识到只需使用itertools就可以将Row()对象转换为字典.
Python 2:
db.row_factory = sqlite3.Row dbCursor = db.cursor() dbCursor.execute("SELECT * FROM table") row = dbCursor.fetchone() rowDict = dict(itertools.izip(row.keys(), row))
或者在Python 3中,更简单:
dbCursor = db.cursor() dbCursor.execute("SELECT * FROM table") row = dbCursor.fetchone() rowDict = dict(zip([c[0] for c in dbCursor.description], row))
同样,您可以使用dbCursor.fetchall()命令将整个行集转换为for循环中的字典列表.
当然,请按照http://trac.edgewall.org/pysqlite.org-mirror/wiki/PysqliteFactories中的解释和说明自己制作DictConnection和DictCursor .