Python – mysqlDB, результат sqlite в качестве словаря

Когда я делаю что-то вроде

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

Я думаю, что нужно помнить порядок, по которому столбцы могут их извлекать, например

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

есть способ вернуть словарь? поэтому я могу вместо этого использовать результат ['id'] или аналогичный?

Проблема с пронумерованными столбцами заключается в том, что если вы напишете свой код, тогда вставьте столбец, который вам может потребоваться, чтобы изменить код, например, результат [1] для first_name теперь может быть date_joined, поэтому вам придется обновить весь код …

У Дэвида Бэйсли хороший пример этого в его 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}] 
 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() 

Выполняя это в mysqlDB, вы просто добавляете следующее к вызову функции подключения

 cursorclass = MySQLdb.cursors.DictCursor 

Вы можете сделать это очень легко. Для 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 

экземпляр 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()]))