2010-11-10 45 views
16

Cuando hago calle detrás comoPython - MySQLdb, resultado de SQLite como diccionario

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

creo que tiene que recordar el orden de las columnas parecen ser capaces de traerlos a cabo, por ejemplo

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

es Hay una forma de devolver un diccionario? entonces, ¿puedo usar el resultado ['id'] o similar?

El problema con las columnas numeradas es que, si escribe el código y luego inserta una columna, quizás tenga que cambiar el código, por ejemplo, el resultado [1] para first_name podría ser una fecha_unificada, por lo que debería actualizarse todo el código.

+0

duplicado posible de [¿Cómo puedo obtener dict de consulta SQLite?] (http://stackoverflow.com/questions/3300464/how-can-i-get-dict-from-sqlite -query) ¿Esto se trata de sqlite o mysql? –

Respuesta

5

David Beazley tiene un buen ejemplo de esto en su Python Essential Reference.
que no tienen el libro en la mano, pero creo que su ejemplo es algo como esto: el uso

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)) 

muestra:

>>> 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}] 
4

Usted puede hacer esto con mucha facilidad. Para SQLite: my_connection.row_factory = sqlite3.Row

encontrar esta información en la documentación de Python: http://docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index

ACTUALIZACIÓN:

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 
+0

Gracias a @Adam por la muestra interactiva. –

11

Hacer esto en MySQLdb que acaba de añadir lo siguiente a la llamada a la función de conexión

cursorclass = MySQLdb.cursors.DictCursor 
1

una instancia sqlite3.Row se puede convertir a dict, muy útil para volcar un resultado como j hijo

>>> 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

esto me da un 'elemento de secuencia de actualización del diccionario # 0 tiene longitud 15; 2 se requiere' – Tobi

29
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() 
+0

Gracias, funciona. – swietyy

+0

¿Hay alguna forma de agregar las filas recuperadas por un 'DictCursor' en un' set() 'sin ejecutar' TypeError: unhashable type: 'dict''? – ray

+1

Esta debería ser la respuesta correcta y aceptada. –