2010-04-20 2 views
5

Y at-il un moyen d'obtenir un curseur de dictionnaire backend-neutre dans Django? Ce serait un curseur qui est un dict plutôt qu'un tuple. Je suis obligé d'utiliser Oracle pour le projet scolaire sur lequel je travaille.Django Backend-neutral DictCursor

Dans le module MySQLDb de Python, il s'appelle un DictCursor.

Avec suggestion inspirante Wolph Je sais que je suis très proche ..

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

Itère et imprimer chaque curseur de la ligne utilisée pour entraîner:

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

Mais avec dict_cursor je reçois:

Je veux seulement qu'il utilise la clé, par exemple:
{('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} 

NET NET.

Après avoir peaufiné un peu plus, cela semble fonctionner:

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

J'ai modifié mon curseur, j'ai mal compris l'objet de description il semble :) – Wolph

Répondre

6

Vous pouvez l'écrire dans quelques lignes :)

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

Ou si vous voulez vraiment économiser de l'espace:

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

Ce one-liner ne fonctionnera pas b/c vous avez perdu votre déclaration de rendement, et je ne vois pas comment vous pouvez céder dans une ligne car le rendement ne peut pas faire partie d'une liste .. –

+2

Vous avez complètement raison, je l'ai modifié :) – Wolph

+1

En faisant cela avec des colonnes comme la date, il retourne quelque chose comme datetime.date (2010,10,21) plutôt que de renvoyer un objet de date réel. J'essaie de renvoyer un jeu de résultats SQL personnalisé en tant que JSON à mon navigateur. – mikec