我在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)
这将允许您按名称(字典样式)或索引访问行元素.这比创建自己的解决方案更有效.
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.
小智 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循环中的字典列表.
当然,请按照http://trac.edgewall.org/pysqlite.org-mirror/wiki/PysqliteFactories中的解释和说明自己制作DictConnection和DictCursor .
| 归档时间: |
|
| 查看次数: |
34829 次 |
| 最近记录: |