当前位置:  开发笔记 > 编程语言 > 正文

Sqlite和Python - 使用fetchone()返回一个字典?

如何解决《Sqlite和Python-使用fetchone()返回一个字典?》经验,为你挑选了4个好方法。

我在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做到这一点?

谢谢!!!



1> Eric..:

在sqlite3中实际上有一个选项.row_factory将连接对象的成员更改为sqlite3.Row:

conn = sqlite3.connect('db', row_factory=sqlite3.Row)

要么

conn.row_factory = sqlite3.Row

这将允许您按名称(字典样式)或索引访问行元素.这比创建自己的解决方案更有效.


但是在使用sqlite3.Row时要小心,不能再使用行[1:3]语法,也不能使用行生成器作为INSERT语句的输入.sqlite3.Row实际上是一个被屠宰的实现.
这实际上是在`sqlite3`模块文档中明确建议的:http://docs.python.org/library/sqlite3.html#row-objects"

2> Colin Burnet..:

我过去这样做的方式:

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.


甚至没有快速和脏,row_factory钩子将是每个连接执行此方法的最佳方式.请注意,至少内置的sqlite3模块已经附带了一个合适的行工厂:sqlite3.Row [http://docs.python.org/library/sqlite3.html#row-objects]

3> 小智..:

我最近在使用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循环中的字典列表.



4> Alex Martell..:

当然,请按照http://trac.edgewall.org/pysqlite.org-mirror/wiki/PysqliteFactories中的解释和说明自己制作DictConnection和DictCursor .


提供的链接已经死亡.
推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有