registrar todas las consultas SQL

98

¿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?

Oleg Pavliv
fuente
stackoverflow.com/questions/1074212/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

19

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.

John Montgomery
fuente
177

Fusiona el siguiente fragmento con el LOGGINGcampo de tu 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'],
        }
    }
}

Tweaked from @ acardenas89 respuesta

Gian Marco
fuente
3
es posible que deba agregar lo siguiente a la 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, },
Don Grem
1
También necesitaba 'version': 1,en el LOGGINGdictado.
Dan
12
Tenga en cuenta que DEBUG debe ser TRUE para que los registros se registren realmente. Independientemente de la configuración de registro.
Janusz Skonieczny
3
Ah, y una cosa más que en Django corredor de prueba ignora los ajustes y sustituciones DEBUGa False, por lo que en la prueba que debe@override_settings(DEBUG=True)
Janusz Skonieczny
7
También agregaría '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.
Andrei-Niculae Petre
44

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

cevaris
fuente
9
No necesita tanto la ifdeclaración en la parte superior como los LOGGINGcambios. La ifdeclaración es para si desea agregar registro mientras, por ejemplo, en el shell, para activarlo inmediatamente, todo lo que necesita en settings.py son los LOGGINGcambios, y es posible que desee django.db.backends, no el específico de sqlite3.
M Somerville
No veo ninguna consulta en la consola que ejecuta django 1.9. DEBUG = True.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 Este es un comentario muy antiguo, muy posiblemente Django 1.9 no sea compatible con esta solución de la misma manera.
cevaris
En Django 1.9, la DEBUGconfiguración está obligada a ser False al ejecutar pruebas. Una solución es volver a habilitarlo en la prueba
Mousiverse
7

Para registrar consultas SQL durante la prueba, necesita dos cosas:

  1. django.db.backends registrador habilitado y
  2. @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()
Janusz Skonieczny
fuente
2

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)o test_function:

@override_settings(DEBUG=True)
class TestA(TestCase):
...

    @override_settings(DEBUG=True)
    def test_function(self):
    ...

¡Créditos a la respuesta de @Janusz Skonieczny!

vedant
fuente
0

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.

vdboor
fuente