22

私が何かをするとき

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

列がそれらを取り出すことができるように見える順序を覚えておく必要があると思います。

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

辞書を返す方法はありますか? 代わりに結果['id']などを使用できますか?

番号付き列の問題は、コードを記述してから列を挿入すると、コードを変更する必要がある場合があることです。たとえば、first_name の結果 [1] が date_joined になる可能性があるため、すべてのコードを更新する必要があります...

4

5 に答える 5

36
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()
于 2013-03-15T01:57:17.987 に答える
13

mysqlDB でこれを行うには、connect 関数呼び出しに以下を追加するだけです。

cursorclass = MySQLdb.cursors.DictCursor
于 2010-11-21T08:01:01.713 に答える
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
于 2010-11-10T19:32:31.450 に答える
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}]
于 2010-11-10T18:27:35.517 に答える
1

sqlite3.Row インスタンスは dict に変換できます - 結果を 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()]))
于 2011-07-06T14:37:56.987 に答える