Python - 将mysqlDB和sqlite的结果作为字典返回

21

当我执行下面这样的操作时

sqlite.cursor.execute("SELECT * FROM foo")
result = sqlite.cursor.fetchone()

我认为必须记住列出现的顺序才能够提取它们,例如:

result[0] is id
result[1] is first_name

有没有一种方法可以返回一个字典? 这样我就可以使用result['id']或类似的方式了吗?

使用编号的列存在的问题是,如果您编写代码然后插入一列,您可能需要更改代码,例如,result[1]表示first_name,但现在可能是date_joined,因此必须更新所有代码...


1
可能是重复的问题:如何从sqlite查询获取字典? 这是关于sqlite还是mysql的问题? - Ciro Santilli OurBigBook.com
5个回答

35
import MySQLdb
dbConn = MySQLdb.connect(host='xyz', user='xyz', passwd='xyz', db='xyz')
dictCursor = dbConn.cursor(MySQLdb.cursors.DictCursor)
dictCursor.execute("SELECT a,b,c FROM table_xyz")
resultSet = dictCursor.fetchall()
for row in resultSet:
    print row['a']
dictCursor.close
dbConn.close()

有没有办法将由DictCursor检索到的行添加到set()中,而不会遇到TypeError: unhashable type: 'dict'的问题? - code_dredd

13

如果在mysqlDB中执行此操作,只需在连接函数调用中添加以下内容:

cursorclass = MySQLdb.cursors.DictCursor

6
你可以非常容易地完成这个操作。对于SQLite,可以使用以下代码:my_connection.row_factory = sqlite3.Row 请查看Python文档:http://docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index 更新:
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.row_factory = sqlite3.Row
>>> c = conn.cursor()
>>> c.execute('create table test (col1,col2)')
<sqlite3.Cursor object at 0x1004bb298>
>>> c.execute("insert into test values (1,'foo')")
<sqlite3.Cursor object at 0x1004bb298>
>>> c.execute("insert into test values (2,'bar')")
<sqlite3.Cursor object at 0x1004bb298>
>>> for i in c.execute('select * from test'): print i['col1'], i['col2']
... 
1 foo
2 bar

感谢 @Adam 提供的交互式示例。 - Matt Williamson

5

David Beazley在他的Python Essential Reference中有一个很好的例子。
我手边没有这本书,但我认为他的例子大致像这样:

def dict_gen(curs):
    ''' From Python Essential Reference by David Beazley
    '''
    import itertools
    field_names = [d[0].lower() for d in curs.description]
    while True:
        rows = curs.fetchmany()
        if not rows: return
        for row in rows:
            yield dict(itertools.izip(field_names, row))

使用示例:

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()
>>> c.execute('create table test (col1,col2)')
<sqlite3.Cursor object at 0x011A96A0>
>>> c.execute("insert into test values (1,'foo')")
<sqlite3.Cursor object at 0x011A96A0>
>>> c.execute("insert into test values (2,'bar')")
<sqlite3.Cursor object at 0x011A96A0>
# `dict_gen` function code here
>>> [r for r in dict_gen(c.execute('select * from test'))]
[{'col2': u'foo', 'col1': 1}, {'col2': u'bar', 'col1': 2}]

1
一个 sqlite3.Row 实例可以转换为字典 - 将结果转储为 JSON 非常方便。
>>> csr = conn.cursor()
>>> csr.row_factory = sqlite3.Row
>>> csr.execute('select col1, col2 from test')
>>> json.dumps(dict(result=[dict(r) for r in csr.fetchall()]))

1
这个错误提示是“字典更新序列元素#0的长度为15,需要2”,请注意。 - Tobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接