войти все sql запросы - PullRequest
       7

войти все sql запросы

74 голосов
/ 07 декабря 2010

Как я могу регистрировать все запросы SQL, которые выполняло мое приложение django?

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

from django.db import connection
connection.queries

, чтобы записать все в один файл?

Итак, мой вопрос - что я должен сделать, чтобы получить файл (скажем, all-sql.log), в котором записаны все операторы SQL?

Ответы [ 6 ]

127 голосов
/ 23 ноября 2013

Объедините следующий фрагмент с полем LOGGING в вашем settings.py:

LOGGING = {
    'version': 1,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }
    }
}

Изменено в ответе @ acardenas89

39 голосов
/ 12 августа 2012

Добавьте следующие жирные выражения в settings.py

<b>
if DEBUG:
    import logging
    l = logging.getLogger('django.db.backends')
    l.setLevel(logging.DEBUG)
    l.addHandler(logging.StreamHandler())
</b>

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },<b>'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        }</b>,
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },<b>'django.db.backends.sqlite3': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }</b>,
    }
}
  

Ресурс / Кредит

17 голосов
/ 07 декабря 2010

Может быть, проверить https://github.com/django-debug-toolbar/django-debug-toolbar

Это позволит вам увидеть все запросы, сгенерированные данной страницей.А также стековые трассы того, где они происходят и т. Д.

РЕДАКТИРОВАТЬ: для записи всех запросов SQL в файл и т. Д., Затем вы захотите создать некоторое промежуточное программное обеспечение.Промежуточное программное обеспечение запускается при каждом запросе.Для такого рода вещей есть несколько фрагментов Django:

Они связаны с печатью натерминал, но было бы нетрудно адаптировать их для использования библиотеки журналов Python.

10 голосов
/ 13 июня 2011

Django 1.3 записывает все операторы SQL в django.db.backends logger:

https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends

1 голос
/ 26 июня 2019

Для регистрации запросов SQL во время тестирования вам понадобятся две вещи:

  1. django.db.backends с включенным регистратором и декоратор
  2. @override_settings(DEBUG=True).

Тестовый бегун будет устанавливать DEBUG = False по умолчанию, игнорируя то, что вы могли установить в DJANGO_SETTINGS_MODULE.

Минимальные настройки:

# https://docs.djangoproject.com/en/dev/ref/settings/#logging
LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ['console'],
    }
}

Пример теста:

from django.contrib.auth.models import User
from django.test import TestCase, override_settings


class UserTests(TestCase):

    # To log queries in tests you need to manually override DEBUG setting
    # because testing sets DEBUG=False by default

    @override_settings(DEBUG=True)
    def test_create_user(self):
        User.objects.create()
0 голосов
/ 07 декабря 2010

Вы должны поместить это в промежуточное программное обеспечение. Промежуточное программное обеспечение находится между ядром веб-сервера / django и всеми вашими взглядами. Он может выполнять предварительную обработку перед запросом и постобработку после завершения запроса. Например, сохраните запросы в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...