Como posso registrar todas as consultas SQL que meu aplicativo django realizou?
Quero registrar tudo, incluindo SQLs do site de administração. Eu vi esta pergunta e uma resposta de FAQ, mas ainda não consigo descobrir onde devo colocar
from django.db import connection
connection.queries
registrar tudo em um arquivo?
Portanto, minha pergunta é - o que devo fazer para ter um arquivo (digamos all-sql.log) onde todas as instruções SQL são registradas?
Respostas:
Verifique https://github.com/django-debug-toolbar/django-debug-toolbar
Ele permitirá que você veja todas as consultas geradas por uma determinada página. Bem como rastreamentos de pilha de onde ocorrem, etc.
EDITAR: para registrar todas as consultas SQL em um arquivo, etc, você vai querer criar algum middleware. Middleware é executado em cada solicitação. Existem vários snippets Django por aí para esse tipo de coisa:
Eles estão preocupados com a impressão no terminal, mas não seria difícil adaptá-los para usar a biblioteca de registro do python.
fonte
Mesclar o seguinte snippet com o
LOGGING
campo emsettings.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'], } } }
Ajustado de @ acardenas89 resposta
fonte
handlers
seção caso obtenha Não foi possível adicionar o manipulador 'console': erro 'console' :'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
'version': 1,
noLOGGING
dict.DEBUG
paraFalse
, assim, no teste que você deve@override_settings(DEBUG=True)
'propagate': False
depois da'handlers': ['console'],
linha, caso você tenha um logger de root habilitado e não saiba porque ele imprime duas vezes. Demorei um pouco para perceber.Adicione as seguintes declarações em negrito em settings.py
Recurso / Crédito
fonte
if
declaração na parte superior e dasLOGGING
alterações. Aif
instrução é para se você deseja adicionar o registro enquanto, por exemplo, no shell, para ativá-lo imediatamente - tudo que você precisa em settings.py são asLOGGING
mudanças - e você pode muito bem quererdjango.db.backends
, não o específico sqlite3.DEBUG = True
.DEBUG
configuração é forçada a ser False durante a execução de testes. Uma solução alternativa é reativá-lo no testeDjango 1.3 registra todas as instruções SQL no django.db.backends logger:
https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends
fonte
Para registrar consultas SQL durante o teste, você precisa de duas coisas:
django.db.backends
logger habilitado e@override_settings(DEBUG=True)
decorador.O executor de teste definirá DEBUG = False por padrão, ignorando o que você pode ter definido em DJANGO_SETTINGS_MODULE.
As configurações mínimas:
# 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'], } }
O exemplo de caso de teste:
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()
fonte
Você só precisa:
@override_settings(DEBUG=True)
se você já tem instruções de depuração SQL sendo impressas em
runserver
.Adicione o decorador ao seu
class TestA(TestCase)
outest_function
:@override_settings(DEBUG=True) class TestA(TestCase): ... @override_settings(DEBUG=True) def test_function(self): ...
Créditos à resposta de @Janusz Skonieczny!
fonte
Você precisa colocar isso em um pacote de middleware. O middleware fica entre o núcleo do servidor web / django e todas as suas visualizações. Ele pode fazer o pré-processamento antes da solicitação e o pós-processamento após a conclusão da solicitação. Por exemplo, salve as consultas em um arquivo.
fonte