2010-04-20 14 views
5

Czy istnieje sposób na uzyskanie neutralnego backendu kursora w Django? Byłby to kursor, który jest raczej dyktatem niż krotką. Jestem zmuszony wykorzystać Oracle do projektu szkolnego, nad którym pracuję.Django Backend-neutralny DictCursor

w module MySQLDb w Pythonie nazywa się DictCursor.

Z inspirującą sugestią WoLpH za wiem, że jestem bardzo blisko ..

def dict_cursor(cursor): 
    for row in cursor: 
     yield dict(zip(cursor.description, row)) 

Iteracja i wydrukowaniu każdej kursor wiersza używany skutkować:

(482072, 602592, 1) 
(656680, 820855, 2) 
(574968, 718712, 4) 
(557532, 696918, 3)) 

Ale z dict_cursor uzyskać:

{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 482072, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 1, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 602592} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 656680, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 2, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 820855} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 574968, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 4, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 718712} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 557532, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 3, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 696918} 

Chcę tylko użyć klawisza, np. "NET SPENT".

Po rafinacji go trochę więcej, to wydaje się działać:

def dict_cursor(cursor): 
    for row in cursor: 
     out = {} 
     for i,col in enumerate(cursor.description): 
      out[col[0]] = row[i] 
     yield out 

-

{'NET_COLLECTED': 602592, 'NET_SPENT': 482072, 'LOT': 1} 
{'NET_COLLECTED': 820855, 'NET_SPENT': 656680, 'LOT': 2} 
{'NET_COLLECTED': 718712, 'NET_SPENT': 574968, 'LOT': 4} 
{'NET_COLLECTED': 696918, 'NET_SPENT': 557532, 'LOT': 3} 
+0

Zmodyfikowałem kursor, źle zrozumiałem obiekt z opisem, jaki się wydaje :) – Wolph

Odpowiedz

6

można napisać go w kilku liniach :)

def dict_cursor(cursor): 
    description = [x[0] for x in cursor.description] 
    for row in cursor: 
     yield dict(zip(description, row)) 

Or jeśli naprawdę chcesz zaoszczędzić miejsce:

simplify_description = lambda cursor: [x[0] for x in cursor.description] 
dict_cursor = lambda c, d: dict(zip(d, r) for r in c)) 
+2

Ten jednolinijkowy nie będzie działał b/c straciłeś deklarację zysku i nie rozumiem, w jaki sposób możesz się poddać jedna linia, ponieważ plon nie może być częścią listy .. –

+2

Masz całkowitą rację, zmodyfikowałem go :) – Wolph

+1

Robiąc to z kolumnami takimi jak data, zwraca coś takiego jak datetime.date (2010, 10, 21) zamiast zwracać rzeczywisty obiekt daty. Próbuję zwrócić niestandardowy zestaw wyników SQL jako JSON do mojej przeglądarki. – mikec