2010-11-10 12 views
16

Kiedy zrobić cos takiego jakPython - MySQLdb, wynik SQLite jako słowniku

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

myślę trzeba pamiętać kolejność kolumn wydają się być w stanie sprowadzić je, np

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

jest istnieje sposób na zwrócenie słownika? więc zamiast tego mogę użyć wyniku ['id'] lub podobnego?

Problem z ponumerowanymi kolumnami polega na tym, że jeśli wpiszesz swój kod, wstaw kolumnę, która może być konieczna do zmiany kodu, np. Wynik [1] dla pierwszego imienia może teraz być datą_rozłączoną, więc musiałby zaktualizować cały kod.

+0

Możliwy duplikat [Jak mogę uzyskać DICT z kwerendy sqlite?] (http://stackoverflow.com/questions/3300464/how-can-i-get-dict-from-sqlite -query) Czy chodzi o sqlite czy mysql? –

Odpowiedz

5

David Beazley ma ładny przykład tego w swoim Python Essential Reference.
nie mam książkę pod ręką, ale myślę, że jego przykład jest coś takiego: Wykorzystanie

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

Próbka:

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

Można to zrobić bardzo łatwo. SQLite: my_connection.row_factory = sqlite3.Row

Sprawdź to na docs Pythona: 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

Dzięki @Adam dla interaktywnej próbki. –

11

Robi to w MySQLdb po prostu dodać następujące connect wywołania funkcji

cursorclass = MySQLdb.cursors.DictCursor 
1

Instancja sqlite3.Row może zostać przekonwertowana na dict - bardzo przydatna do zrzutu wyniku jako j syn

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

to daje mi 'element sekwencji aktualizacji słownikowej # 0 ma długość 15; 2 jest wymagane " – 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

Dzięki, to działa. – swietyy

+0

Czy istnieje sposób, aby dodać wiersze pobrane przez 'DictCursor' do' set() 'bez uruchamiania do' TypeError: unhashable type: 'dict''? – ray

+1

To powinna być poprawna i zaakceptowana odpowiedź. –