Как просмотреть соответствующий SQL-запрос из набора запросов Django ORM?


164

Можно ли напечатать запрос, который генерирует Django ORM?

Скажем, я выполняю следующее утверждение: Model.objects.filter(name='test')

Как мне увидеть сгенерированный SQL-запрос?

Ответы:


178

Каждый объект QuerySet имеет queryатрибут, который вы можете регистрировать или распечатывать на стандартный вывод для целей отладки.

qs = Model.objects.filter(name='test')
print qs.query

редактировать

Я также использовал настраиваемые теги шаблонов (как описано в этом фрагменте ), чтобы вводить запросы в рамках одного запроса в виде комментариев HTML.


6
как насчет запросов для .save ()?
DataGreed

@DataGreed Хороший вопрос, возможно, стоит задать его в новой теме, чтобы получить больше ответов.
Джо Холлоуэй

4
Работает ли то prefetch_relatedесть показывает 2 запроса? Я вижу только 1.
пользователь

не работает я вижу<django.db.models.sql.query.Query object
допатраман

Попробуйте напечатать (str (qs.query)). Я думаю, что они немного изменили внутренности за 10 лет
Джо Холлоуэй

114

Вы также можете использовать python logging для регистрации всех запросов, сгенерированных Django. Просто добавьте это в ваш файл настроек.

LOGGING = {
    'disable_existing_loggers': False,
    'version': 1,
    'handlers': {
        'console': {
            # logging handler that outputs log messages to terminal
            'class': 'logging.StreamHandler',
            'level': 'DEBUG', # message level to be written to console
        },
    },
    'loggers': {
        '': {
            # this sets root level logger to log debug and higher level
            # logs to console. All other loggers inherit settings from
            # root level logger.
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False, # this tells logger to send logging message
                                # to its parent (will send if set to True)
        },
        'django.db': {
            # django also has database level logging
        },
    },
}

Другой способ, если приложение генерирует вывод html - можно использовать панель отладки django .


3
Если кто - то хотели бы иметь резюме с sumup из числа выполненных запросов , а также общее время потребовалось: dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
Это не работает для меня, я должен был добавить 'level': 'DEBUG'под 'django.db'.
rvernica

108

Вы можете вставить этот код в вашу оболочку, которая будет отображать все запросы SQL:

# To get all sql queries sent by Django from py shell
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())


30

Может быть, вам стоит взглянуть на django-debug-toolbarприложение, оно будет регистрировать все запросы для вас, отображать информацию о профилировании для них и многое другое.


3
Это очень полезно, но работает только в графическом интерфейсе, и иногда вы хотите видеть журналы запросов непосредственно в ORM. Например, у вас есть API, без графического интерфейса!
Вим

3

Надежное решение будет иметь журнал вашей базы данных в файл, а затем

tail -f /path/to/the/log/file.log

2

Если вы используете маршрутизацию базы данных, возможно, у вас более одного соединения с базой данных. Подобный код позволяет вам видеть соединения в сеансе. Вы можете сбросить статистику так же, как с одним соединением:reset_queries()

from django.db import connections,connection,reset_queries
...
reset_queries()  # resets data collection, call whenever it makes sense

...

def query_all():
    for c in connections.all():
        print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")

# and if you just want to count the number of queries
def query_count_all()->int:
    return sum(len(c.queries) for c in connections.all() )

1

Вы можете использовать Django debug_toolbar для просмотра SQL-запроса. Пошаговое руководство по использованию debug_toolbar:

Установите Debug_toolbar

pip install django-debug-toolbar

Отредактируйте файл settings.py и добавьте debug_toolbar в Установленные приложения, это следует добавить ниже в 'django.contrib.staticfiles'. Также добавьте debug_toolbar в Middleware.

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

создайте новый список с именем INTERNAL_IPS в файле settings.py

Settings.py => создать новый список в конце файла settings.py и добавить следующий список:

INTERNAL_IPS= [127.0.0.1']

Это позволит отладке работать только на внутреннем сервере разработки

Отредактируйте файл urls.py в #Project и добавьте следующий код:

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
    url(r'^__debug__/', include(debug_toolbar.urls))       
    ] + urlpatterns

применить миграцию и запустить сервер снова

Вы увидите надстройку на своей веб-странице по адресу 127.0.0.1, и если вы установите флажок SQL Query, вы также сможете увидеть время выполнения запроса.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.