2010-11-10 14 views
16

Quando faccio someting comePython - MySQLdb, risultato SQLite come dizionario

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

penso deve ricordare l'ordine delle colonne sembrano essere in grado di prenderli fuori, ad esempio

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

è c'è un modo per restituire un dizionario? quindi posso invece usare solo risultato ['id'] o simile?

Il problema con le colonne numerate è, se si scrive il codice, quindi si inserisce una colonna che potrebbe essere necessario modificare il codice, ad es. Il risultato [1] per first_name potrebbe essere un data_joined quindi dovrebbe aggiornare tutto il codice ..

+0

Eventuali duplicati di [Come posso ottenere dict da Query SQLite?] (http://stackoverflow.com/questions/3300464/how-can-i-get-dict-from-sqlite -query) Si tratta di sqlite o mysql? –

risposta

5

David Beazley ha un bell'esempio di questo nel suo Python Essential Reference.
Non ho il libro a portata di mano, ma penso che il suo esempio è qualcosa di simile: l'utilizzo

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

Esempio:

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

Si può fare questo molto facilmente. Per SQLite: my_connection.row_factory = sqlite3.Row

Check it out sui documenti pitone: http://docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index

UPDATE:

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

Grazie a @Adam per l'esempio interattivo. –

11

fare questo in MySQLdb è sufficiente aggiungere il seguente alla funzione di chiamata di connessione

cursorclass = MySQLdb.cursors.DictCursor 
1

un'istanza sqlite3.Row può essere convertita in dict, molto utile per scaricare un risultato come j figlio

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

questo mi dà un 'elemento di sequenza di aggiornamento del dizionario # 0 ha lunghezza 15; 2 è richiesto' – 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

Grazie, funziona. – swietyy

+0

C'è un modo per aggiungere le righe recuperate da un 'DictCursor' in un' set() 'senza eseguire in' TypeError: tipo non disattivabile: 'dict''? – ray

+1

Questa dovrebbe essere la risposta corretta e accettata. –