¿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
LOGGING
campo 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
handlers
secció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 elLOGGING
dictado.DEBUG
aFalse
, por lo que en la prueba que debe@override_settings(DEBUG=True)
'propagate': False
despué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
Recurso / Crédito
fuente
if
declaración en la parte superior como losLOGGING
cambios. Laif
declaración es para si desea agregar registro mientras, por ejemplo, en el shell, para activarlo inmediatamente, todo lo que necesita en settings.py son losLOGGING
cambios, y es posible que deseedjango.db.backends
, no el específico de sqlite3.DEBUG = True
.DEBUG
configuració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.backends
registrador 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