2009-04-30 13 views
6

In una delle mie viste di django, eseguo query sul database utilizzando sql semplice (non orm) e restituisco i risultati.Come ottenere i nomi dei campi quando si esegue una query sql semplice in django

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

Ottengo i dati bene, ma non i nomi di colonna. Come posso ottenere i nomi dei campi del set di risultati che viene restituito?

+0

Perché mai avresti bisogno di questo genere di cose? Sembra un bug che aspetta di accadere. –

+0

Questo è un esempio semplificato per illustrare che i nomi delle colonne non sono noti in anticipo. Quindi, dopo aver ottenuto il set di risultati, avevo bisogno di un modo per recuperare anche i nomi delle colonne. –

risposta

7

Secondo PEP 249, è possibile provare a utilizzare cursor.description, ma questo non è del tutto affidabile.

+0

Grazie, questo è esattamente ciò di cui avevo bisogno. –

+0

Perché non è affidabile? Per me va bene. Dovrei essere preoccupato? – user984003

+0

@ user984003: "Gli oggetti cursore ** dovrebbero ** rispondere ai seguenti metodi e attributi." (sottolineatura mia) –

3

Ho trovato una bella soluzione nel blog di 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 

Esempio utilizzo:

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

Sul Django docs, c'è un metodo molto semplice fornito (che fa effettivamente usare cursor.description, come rispose Ignacio).

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() 
    ] 
Problemi correlati