Як переглянути відповідний SQL-запит набору запитів Django ORM?


164

Чи є спосіб я надрукувати запит, який генерує Django ORM?

Скажіть, я виконую таке твердження: Model.objects.filter(name='test')

Як я можу побачити створений SQL-запит?

Відповіді:


178

Кожен об’єкт QuerySet має queryатрибут, який ви можете ввійти або надрукувати в stdout для цілей налагодження.

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 для реєстрації всіх запитів, створених 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, без GUI!
Вім

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 для перегляду SQL-запиту. Покрокове керівництво по використанню налагодження налагодження:

Встановіть панель 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 & add нижче коду:

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.