Как я могу видеть необработанные SQL-запросы, которые выполняет Django?

О u'foo' :

Это нормальное поведение Python, u'something' означает, что ваша строка является строкой Unicode. подробнее о строках Unicode см. Здесь

Вы можете исправить это, просто используя эту строку, чтобы записать dict в виде строки JSON, кстати, вы должны всегда использовать [114 ] (или json.dumps()) для записи строки JSON:

text_file.write(json.dump(data))

О порядке ключей :

Во-первых, RFC JSON прямо говорит об этом:

Объект - это неупорядоченная коллекция из нуля или более пар имя / значение, где имя - это строка, а значение - это строка, число, логическое значение, ноль, объект, или массив.

blockquote>

Здесь « object » означает « hash », это то, что мы называем « dictionnaries » с помощью Python. Это означает, что ключи строки JSON никогда не упорядочены.

Кроме того,

data = json.load(json_file) загружает строку JSON и анализирует ее в словарь Python. Диконы Python также не упорядочены (по крайней мере, до Python3.7).

Это означает две вещи:

  1. Вы не можете прочитать файл JSON в ожидаемом порядке.
  2. Согласно пункту 1, не имеет смысла писать строку JSON в определенном порядке (поскольку вы не сможете прочитать ее в том же порядке)

269
задан Nathan Wailes 16 September 2017 в 06:19
поделиться

4 ответа

См. Часто задаваемые вопросы по документации: « Как я могу увидеть необработанные SQL-запросы, выполняемые Django? »

django.db.connection.queries содержит список запросов SQL:

from django.db import connection
print(connection.queries)

Наборы запросов также имеют атрибут query , содержащий запрос, который должен быть выполнен:

print(MyModel.objects.filter(name="my name").query)

Обратите внимание, что вывод запроса не является допустимым SQL, потому что:

«Django никогда не интерполирует параметры: он отправляет запрос и параметры отдельно адаптеру базы данных, который выполняет соответствующие операции.»

Из отчета об ошибке Django # 17741 .

Из-за что вы не должны отправлять выходные данные запроса непосредственно в базу данных.

335
ответ дан 23 November 2019 в 02:19
поделиться

Я поместил эту функцию в util файл в одном из приложений в моем проекте:

import logging
import re

from django.db import connection

logger = logging.getLogger(__name__)

def sql_logger():
    logger.debug('TOTAL QUERIES: ' + str(len(connection.queries)))
    logger.debug('TOTAL TIME: ' + str(sum([float(q['time']) for q in connection.queries])))

    logger.debug('INDIVIDUAL QUERIES:')
    for i, query in enumerate(connection.queries):
        sql = re.split(r'(SELECT|FROM|WHERE|GROUP BY|ORDER BY|INNER JOIN|LIMIT)', query['sql'])
        if not sql[0]: sql = sql[1:]
        sql = [(' ' if i % 2 else '') + x for i, x in enumerate(sql)]
        logger.debug('\n### {} ({} seconds)\n\n{};\n'.format(i, query['time'], '\n'.join(sql)))

Затем при необходимости, я просто импортирую его и звоню, это от любого контекста (обычно представление) необходимо, например:

# ... other imports
from .utils import sql_logger

class IngredientListApiView(generics.ListAPIView):
    # ... class variables and such

    # Main function that gets called when view is accessed
    def list(self, request, *args, **kwargs):
        response = super(IngredientListApiView, self).list(request, *args, **kwargs)

        # Call our function
        sql_logger()

        return response

хорошо сделать эту внешнюю сторону шаблон, потому что затем, если у Вас есть представления API (обычно Django Rest Framework), это применимо там также.

0
ответ дан 23 November 2019 в 02:19
поделиться

Взгляните на debug_toolbar , он очень полезен для отладки.

Документация и исходный код доступны на http: // django-debug-toolbar. readthedocs.io/[1128456 impression.[1225 impression

48
ответ дан 23 November 2019 в 02:19
поделиться

Хотя вы можете сделать это с помощью предоставленного кода, Я считаю, что использование приложения панели инструментов отладки - отличный инструмент для отображения запросов. Вы можете скачать его с github здесь .

Это дает вам возможность показать все запросы, выполненные на данной странице, а также время, затраченное на запрос. Он также суммирует количество запросов на странице и общее время для быстрого просмотра. Это отличный инструмент, если вы хотите посмотреть, что Django ORM делает за кулисами. В нем также есть много других хороших функций, которые вы можете использовать, если хотите.

17
ответ дан 23 November 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: