Регистрировать все запросы sql
Как я могу регистрировать все SQL-запросы, выполняемые моим приложением django?
Я хочу регистрировать все, включая SQL файлы с сайта администратора. Я видел этот вопрос и ответ на часто задаваемый вопрос, но я до сих пор не могу понять, где я должен положить
from django.db import connection
connection.queries
записать все в один файл?
Итак, мой вопрос: что мне делать, чтобы иметь файл (скажем, all-sql.log), где записываются все SQL-инструкции?
Ответы
Ответ 1
Возможно, зайдите https://github.com/django-debug-toolbar/django-debug-toolbar
Это позволит вам увидеть все запросы, сгенерированные данной страницей. Также, как и стекы, где они встречаются и т.д.
EDIT: для регистрации всех SQL-запросов в файл и т.д., вы захотите создать некоторое промежуточное ПО. Middleware запускается по каждому запросу. Для этого есть несколько фрагментов Django:
Те, кто связан с печатью на терминале, не будут трудно адаптировать их для использования библиотеки протоколов python.
Ответ 2
Объедините следующий фрагмент с полем 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 ответ
Ответ 3
Добавьте следующие жирные выражения в settings.py
if DEBUG:
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
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'
},'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},'django.db.backends.sqlite3': {
'level': 'DEBUG',
'handlers': ['console'],
},
}
}
Ресурс/Кредит
Ответ 4
Django 1.3 регистрирует все операторы SQL в django.db.backends logger:
https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends
Ответ 5
Для записи 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()
Ответ 6
Вам нужно поместить это в пакет промежуточного программного обеспечения. Средство промежуточного уровня находится между ядром webserver/django и всеми вашими представлениями. Он может выполнять предварительную обработку перед запросом и постобработку после завершения запроса. Например, сохраните запросы в файл.