Jak mogę rejestrować wszystkie zapytania SQL, które wykonała moja aplikacja django?
Chcę rejestrować wszystko, w tym SQL ze strony administratora. Widziałem to pytanie i odpowiedź na często zadawane pytania, ale nadal nie mogę dowiedzieć się, gdzie mam je umieścić
from django.db import connection
connection.queries
zapisywać wszystko do jednego pliku?
Więc moje pytanie brzmi - co powinienem zrobić, aby mieć plik (powiedzmy all-sql.log), w którym rejestrowane są wszystkie instrukcje SQL?
Odpowiedzi:
Może sprawdź https://github.com/django-debug-toolbar/django-debug-toolbar
Pozwoli Ci zobaczyć wszystkie zapytania generowane przez daną stronę. A także ślady stosów miejsc, w których występują itp.
EDYCJA: aby rejestrować wszystkie zapytania SQL do pliku itp., Będziesz chciał utworzyć oprogramowanie pośredniczące. Oprogramowanie pośredniczące jest uruchamiane na każde żądanie. Istnieje kilka fragmentów Django dotyczących tego rodzaju rzeczy:
Są one związane z drukowaniem na terminalu, ale nie byłoby trudno dostosować je do korzystania z biblioteki logującej Pythona.
źródło
Scal następujący fragment z
LOGGING
polem wsettings.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'], } } }
Poprawiono z @ acardenas89 odpowiedź
źródło
handlers
sekcji następujących elementów na wypadek, gdyby nie można było dodać programu obsługi „konsoli”: błąd „konsoli” :'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
'version': 1,
wLOGGING
dyktandzie.DEBUG
naFalse
, więc w teście trzeba@override_settings(DEBUG=True)
'propagate': False
po'handlers': ['console'],
linii, na wypadek gdybyś miał włączony główny rejestrator i nie wiedział, dlaczego to się drukuje dwukrotnie. Trochę mi zajęło zrozumienie.Dodaj następujące pogrubione stwierdzenia w settings.py
Zasób / Kredyt
źródło
if
oświadczenia u góry, jak iLOGGING
zmian.if
Stwierdzenie jest dla jeśli chcesz dodać rejestrowanie podczas gdy na przykład w powłoce, aby włączyć go natychmiast - wszystko, czego potrzebujesz w settings.py jestLOGGING
zmiana - i może dobrze chcedjango.db.backends
, a nie jeden sqlite3 specyficzny.DEBUG = True
.DEBUG
ustawienie jest wymuszane na False podczas uruchamiania testów. Obejściem jest ponowne włączenie go w teścieDjango 1.3 loguje wszystkie instrukcje SQL do rejestratora django.db.backends :
https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends
źródło
Aby rejestrować zapytania SQL podczas testowania, potrzebujesz dwóch rzeczy:
django.db.backends
rejestrator włączony i@override_settings(DEBUG=True)
dekorator.Biegacz testowy będzie domyślnie ustawi DEBUG = False , ignorując to, co mogłeś ustawić w DJANGO_SETTINGS_MODULE.
Minimalne ustawienia:
# 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'], } }
Przykładowy przypadek testowy:
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()
źródło
Potrzebujesz tylko:
@override_settings(DEBUG=True)
jeśli masz już instrukcje debugowania SQL, które są drukowane w programie
runserver
.Dodaj dekorator do swojego
class TestA(TestCase)
lubtest_function
:@override_settings(DEBUG=True) class TestA(TestCase): ... @override_settings(DEBUG=True) def test_function(self): ...
Podziękowania dla odpowiedzi @Janusz Skonieczny!
źródło
Musisz umieścić to w pakiecie oprogramowania pośredniego. Oprogramowanie pośredniczące znajduje się między rdzeniem serwera WWW / django a wszystkimi widokami. Może wykonywać wstępne przetwarzanie przed żądaniem i przetwarzanie końcowe po zakończeniu żądania. Na przykład zapisz zapytania do pliku.
źródło