Как получить имена полей при запуске простого SQL-запроса в Django - PullRequest
8 голосов
/ 30 апреля 2009

В одном из моих представлений django я запрашиваю базу данных, используя обычный sql (не orm), и возвращаю результаты.

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

Я получаю данные в порядке, но не имена столбцов. Как я могу получить имена полей возвращаемого набора результатов?

Ответы [ 3 ]

10 голосов
/ 30 апреля 2009

Согласно PEP 249 , вы можете попробовать использовать cursor.description, но это не совсем надежно.

8 голосов
/ 15 августа 2014

На Django docs предусмотрен довольно простой метод (который действительно использует cursor.description, как ответил Игнасио).

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()
    ]
5 голосов
/ 08 января 2013

Я нашел хорошее решение в блоге Дуга Хеллмана:

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

Пример использования:

  row_dicts = query_to_dicts("""select * from table""") 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...