Использование dict_cursor в Django

Чтобы получить курсор в Django я делаю:

from django.db import connection
cursor = connection.cursor()

Как бы я получил курсор в Django, эквивалент -

import MySQLdb
connection = (establish connection)
dict_cursor = connection.cursor(MySQLdb.cursors.DictCursor)

Есть ли способ сделать это в Django? Когда я пыталсяcursor = connection.cursor(MySQLdb.cursors.DictCursor) Я получилException Value: cursor() takes exactly 1 argument (2 given), Или мне нужно подключиться напрямую с драйвером python-mysql?

Документы Django предлагают использоватьdictfetchall:

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

Есть ли разница в производительности между использованием этого и созданием dict_cursor?

Ответы на вопрос(3)

DictCursor в Джанго. Но вы можете написать для этого небольшую функцию, см. Документацию:Выполнение пользовательского SQL напрямую:

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

>>> cursor.execute("SELECT id, parent_id from test LIMIT 2");
>>> dictfetchall(cursor)
[{'parent_id': None, 'id': 54360982L}, {'parent_id': None, 'id': 54360880L}] 
 15 нояб. 2018 г., 09:57
Я думаю, что этот ответ помогает многим людям, которые приходят сюда. Но если вы читаете оригинальный вопрос, то ответ не совпадает: есть ли разница в производительности между использованием dictfetchall () и созданием dict_cursor?

from django.db import connections
cursor = connections['default'].cursor()

columns = (x.name for x in cursor.description)
result = cursor.fetchone()
result = dict(zip(columns, result))

Если результирующий набор имеет несколько строк, вместо этого перебирайте курсор.

columns = [x.name for x in cursor.description]
for row in cursor:
    row = dict(zip(columns, row))
 10 сент. 2015 г., 19:41
Просто интересная заметка. Выражение (x.name для x в cursor.description) создает генератор, а не объект списка. Такой генератор будет исчерпан после первой итерации «строки в курсоре» петля. Чтобы этот пример кода работал с несколькими строками, нам нужно предварительно выбрать столбцы, изменив круглые скобки на квадратные: [x.name для x в cursor.description]

это легко сделать с Postgres, я уверен, что у mysql есть подобное (Django 1.11)

from django.db import connections
from psycopg2.extras import NamedTupleCursor


def scan_tables(app):
    conn = connections['default']
    conn.ensure_connection()
    with conn.connection.cursor(cursor_factory=NamedTupleCursor) as cursor:
        cursor.execute("SELECT table_name, column_name "
                       "FROM information_schema.columns AS c "
                       "WHERE table_name LIKE '{}_%'".format(app))
        columns = cursor.fetchall()
        for column in columns:
            print(column.table_name, column.column_name)


scan_tables('django')

Очевидно, вы можете использовать DictCursor, RealDictCursor, LoggingCursor и т. Д.

 10 авг. 2018 г., 01:36
Он не работает с курсором Django. Чтобы использовать эту функцию, вы должны импортировать курсор psycopg2. Протестировано с Django == 1.11.6
 09 февр. 2019 г., 22:50
Вторая строка в моем фрагменте кода явно говоритfrom psycopg2.extras import NamedTupleCursor

Ваш ответ на вопрос