2009-04-30 6 views
6

En una de mis vistas django consulto la base de datos utilizando sql (no orm) y obtengo resultados.Cómo obtener los nombres de los campos cuando se ejecuta la consulta SQL simple en django

sql = "select * from foo_bar" 
cursor = connection.cursor() 
cursor.execute(sql) 
rows = cursor.fetchall() 

Estoy obteniendo los datos bien, pero no los nombres de las columnas. ¿Cómo puedo obtener los nombres de campo del conjunto de resultados que se devuelve?

+0

¿Por qué demonios necesitarías este tipo de cosas? Esto suena como un error esperando a suceder. –

+0

Este es un ejemplo simplificado para ilustrar que los nombres de las columnas no se conocen de antemano. Entonces, después de obtener el resultado, necesitaba una forma de recuperar los nombres de las columnas también. –

Respuesta

7

Según PEP 249, puede intentar usar cursor.description, pero esto no es del todo confiable.

+0

Gracias, esto es exactamente lo que necesitaba. –

+0

¿Por qué esto no es confiable? Funciona para mi. ¿Deberia estar preocupado? – user984003

+0

@ user984003: "Cursor Objects ** debe ** responder a los siguientes métodos y atributos". (énfasis mío) –

3

he encontrado una buena solución en el blog de Doug Hellmann:

http://doughellmann.com/2007/12/30/using-raw-sql-in-django.html

from itertools import * 
from django.db import connection 

def query_to_dicts(query_string, *query_args): 
    """Run a simple query and produce a generator 
    that returns the results as a bunch of dictionaries 
    with keys for the column values selected. 
    """ 
    cursor = connection.cursor() 
    cursor.execute(query_string, query_args) 
    col_names = [desc[0] for desc in cursor.description] 
    while True: 
     row = cursor.fetchone() 
     if row is None: 
      break 
     row_dict = dict(izip(col_names, row)) 
     yield row_dict 
    return 

Ejemplo de uso:

row_dicts = query_to_dicts("""select * from table""") 
7

Por Django docs, hay un método bastante simple proporcionado (que hace de hecho use cursor.description, como Ignacio contestó).

def dictfetchall(cursor): 
    "Returns all rows from a cursor as a dict" 
    desc = cursor.description 
    return [ 
     dict(zip([col[0] for col in desc], row)) 
     for row in cursor.fetchall() 
    ] 
Cuestiones relacionadas