2010-04-20 14 views
5

¿Hay alguna forma de obtener un cursor de diccionario neutral en back-end en Django? Este sería un cursor que es un dict en lugar de una tupla. Me veo obligado a utilizar Oracle para el proyecto escolar en el que estoy trabajando.Django Back-end neutral DictCursor

en el módulo MySQLDb de Python se llama DictCursor.

con la sugerencia inspirador de WoLpH Sé que estoy muy cerca ..

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

iteración e imprimir cada cursor fila se utiliza para dar como resultado:

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

Pero con dict_cursor me sale:

{('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} 

Solo quiero que use la clave, por ejemplo 'NET SPENT'.

Después de refinar un poco más, esto parece funcionar:

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

He modificado mi cursor, he entendido mal el objeto de descripción que parece :) – Wolph

Respuesta

6

Se puede escribir en un par de líneas :)

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

O si realmente quiere ahorrar espacio:

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

Ese trazador de líneas único no funcionará b/c ha perdido su declaración de rendimiento, y no veo cómo puede ceder en una línea ya que el rendimiento no puede ser parte de una lista. –

+2

Tiene toda la razón, lo he modificado :) – Wolph

+1

Al hacer esto con columnas como date, se devuelve algo así como datetime.date (2010,10,21) en lugar de devolver un objeto de fecha real. Estoy intentando devolver un conjunto de resultados de SQL personalizado como JSON a mi navegador. – mikec

Cuestiones relacionadas