¿Cómo puedo registrar todas las consultas SQL que realizó mi aplicación django?
Quiero registrar todo, incluidos los SQL del sitio de administración. Vi esta pregunta y una respuesta a las preguntas frecuentes, pero todavía no puedo averiguar dónde debo poner
from django.db import connection
connection.queries
para registrar todo en un archivo?
Entonces, mi pregunta es: ¿qué debo hacer para tener un archivo (por ejemplo, all-sql.log) donde se registran todas las declaraciones SQL?

Respuestas:
Tal vez consulte https://github.com/django-debug-toolbar/django-debug-toolbar
Te permitirá ver todas las consultas generadas por una página determinada. Así como los rastros de pila de dónde ocurren, etc.
EDITAR: para registrar todas las consultas SQL en un archivo, etc., entonces querrá crear algún middleware. El middleware se ejecuta en cada solicitud. Hay varios fragmentos de Django para este tipo de cosas:
Aquellos están preocupados por imprimir en la terminal, pero no sería difícil adaptarlos para usar la biblioteca de registro de Python.
fuente
Fusiona el siguiente fragmento con el
LOGGINGcampo de tusettings.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'], } } }Tweaked from @ acardenas89 respuesta
fuente
handlerssección en caso de que no pueda agregar el controlador 'consola': error de 'consola' :'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },'version': 1,en elLOGGINGdictado.DEBUGaFalse, por lo que en la prueba que debe@override_settings(DEBUG=True)'propagate': Falsedespués de la'handlers': ['console'],línea, en caso de que tenga un registrador raíz habilitado y no sepa por qué se imprime dos veces. Me tomó un poco darme cuenta.Agregue las siguientes declaraciones en negrita en settings.py
si DEBUG: registro de importación l = logging.getLogger ('django.db.backends') l.setLevel (registro.DEBUG) l.addHandler (logging.StreamHandler ()) REGISTRO = { 'versión 1, 'disable_existing_loggers': Falso, 'filtros': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse' } }, 'handlers': { 'mail_admins': { 'nivel': 'ERROR', 'filtros': ['require_debug_false'], 'clase': 'django.utils.log.AdminEmailHandler' }, 'consola': { 'nivel': 'DEPURACIÓN', 'clase': 'logging.StreamHandler', } , }, 'registradores': { 'django.request': { 'handlers': ['mail_admins'], 'nivel': 'ERROR', 'propagar': Verdadero, }, 'django.db.backends.sqlite3': { 'nivel': 'DEPURACIÓN', 'handlers': ['consola'], } , } }Recurso / Crédito
fuente
ifdeclaración en la parte superior como losLOGGINGcambios. Laifdeclaración es para si desea agregar registro mientras, por ejemplo, en el shell, para activarlo inmediatamente, todo lo que necesita en settings.py son losLOGGINGcambios, y es posible que deseedjango.db.backends, no el específico de sqlite3.DEBUG = True.DEBUGconfiguración está obligada a ser False al ejecutar pruebas. Una solución es volver a habilitarlo en la pruebaDjango 1.3 registra todas las sentencias SQL en django.db.backends logger:
https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends
fuente
Para registrar consultas SQL durante la prueba, necesita dos cosas:
django.db.backendsregistrador habilitado y@override_settings(DEBUG=True)decorador.El corredor de pruebas establecerá DEBUG = False de forma predeterminada, ignorando lo que puede haber establecido en DJANGO_SETTINGS_MODULE.
La configuración mínima:
# 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'], } }El caso de prueba de ejemplo:
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()fuente
Solo necesitas:
@override_settings(DEBUG=True)si ya se están imprimiendo sentencias de depuración SQL
runserver.Agregue el decorador a su
class TestA(TestCase)otest_function:@override_settings(DEBUG=True) class TestA(TestCase): ... @override_settings(DEBUG=True) def test_function(self): ...¡Créditos a la respuesta de @Janusz Skonieczny!
fuente
Debe poner esto en un paquete de middleware. El middleware se encuentra entre el núcleo del servidor web / django y todas sus vistas. Puede realizar el preprocesamiento antes de la solicitud y el posprocesamiento después de que se complete la solicitud. Por ejemplo, guarde las consultas en un archivo.
fuente