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

28 python database sqlite

我在python 2.5中使用sqlite3.我创建了一个如下所示的表:

   create table votes (
      bill text,
      senator_id text,
      vote text)
Run Code Online (Sandbox Code Playgroud)

我用这样的东西访问它:

v_cur.execute("select * from votes")
row = v_cur.fetchone()
bill = row[0]
senator_id = row[1]
vote = row[2]
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是让fetchone(或其他一些方法)返回一个字典,而不是一个列表,这样我就可以通过名称而不是位置来引用字段.例如:

bill = row['bill'] 
senator_id = row['senator_id']
vote = row['vote']
Run Code Online (Sandbox Code Playgroud)

我知道你可以用MySQL做到这一点,但是有谁知道如何用SQLite做到这一点?

谢谢!!!

Eri*_*ric 74

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

conn = sqlite3.connect('db', row_factory=sqlite3.Row)
Run Code Online (Sandbox Code Playgroud)

要么

conn.row_factory = sqlite3.Row
Run Code Online (Sandbox Code Playgroud)

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

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

Col*_*ett 18

我过去这样做的方式:

def dict_factory(cursor, row):
    d = {}
    for idx,col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d
Run Code Online (Sandbox Code Playgroud)

然后在连接中进行设置:

from pysqlite2 import dbapi2 as sqlite
conn = sqlite.connect(...)
conn.row_factory = dict_factory
Run Code Online (Sandbox Code Playgroud)

这适用于pysqlite-2.4.1和python 2.5.4.

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

小智 9

我最近在使用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))
Run Code Online (Sandbox Code Playgroud)

或者在Python 3中,更简单:

dbCursor = db.cursor()
dbCursor.execute("SELECT * FROM table")
row = dbCursor.fetchone()
rowDict = dict(zip([c[0] for c in dbCursor.description], row))
Run Code Online (Sandbox Code Playgroud)

同样,您可以使用dbCursor.fetchall()命令将整个行集转换为for循环中的字典列表.


Ale*_*lli 5

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

  • 提供的链接已经死亡. (5认同)