Как я могу регистрировать все SQL-запросы, выполненные моим приложением django?
Я хочу регистрировать все, включая SQL-запросы с сайта администратора. Я видел этот вопрос и ответы на часто задаваемые вопросы, но до сих пор не могу понять, куда мне положить
from django.db import connection
connection.queries
записывать все в один файл?
Итак, мой вопрос: что мне делать, чтобы иметь файл (скажем, all-sql.log), в котором регистрируются все операторы SQL?
Ответы:
Возможно, проверьте https://github.com/django-debug-toolbar/django-debug-toolbar
Это позволит вам увидеть все запросы, сгенерированные данной страницей. А также трассировки стека, где они встречаются и т. Д.
РЕДАКТИРОВАТЬ: чтобы регистрировать все SQL-запросы в файл и т.д., тогда вам нужно будет создать промежуточное программное обеспечение. Промежуточное ПО запускается по каждому запросу. Для такого рода вещей существует несколько фрагментов Django:
Они связаны с печатью на терминале, но их нетрудно адаптировать для использования библиотеки журналов python.
источник
Объедините следующий фрагмент с
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
источник
handlers
раздел на случай, если вы получите сообщение Невозможно добавить обработчик 'console': 'console' error:'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
'version': 1,
вLOGGING
диктате.DEBUG
дляFalse
, поэтому в тесте вы должны@override_settings(DEBUG=True)
'propagate': False
после'handlers': ['console'],
строки, если у вас включен корневой регистратор и вы не знаете, почему он печатается дважды. Мне потребовалось немного времени, чтобы осознать.Добавьте следующие жирные инструкции в settings.py
Ресурс / Кредит
источник
if
утверждение вверху, иLOGGING
изменения.if
Заявление, если вы хотите добавить протоколирование в то время как , например , в оболочке, чтобы включить его сразу - все , что вам нужно в settings.py этоLOGGING
изменение - и Вы могли бы также хотетьdjango.db.backends
, не sqlite3 специфичен.DEBUG = True
.DEBUG
параметра принудительно устанавливается значение False при запуске тестов. Обходной путь - повторно включить его в тестеDjango 1.3 записывает все операторы SQL в журнал django.db.backends :
https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends
источник
Чтобы регистрировать SQL-запросы во время тестирования, вам понадобятся две вещи:
django.db.backends
регистратор включен и@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()
источник
Вам нужно всего лишь:
@override_settings(DEBUG=True)
если у вас уже есть операторы отладки SQL, которые печатаются
runserver
.Добавьте декоратор в свой
class TestA(TestCase)
илиtest_function
:@override_settings(DEBUG=True) class TestA(TestCase): ... @override_settings(DEBUG=True) def test_function(self): ...
Кредиты ответу @Janusz Skonieczny!
источник
Вам нужно поместить это в пакет промежуточного программного обеспечения. Промежуточное ПО находится между ядром веб-сервера / django и всеми вашими представлениями. Он может выполнять предварительную обработку перед запросом и постобработку после выполнения запроса. Например, сохраните запросы в файл.
источник