loguje wszystkie zapytania sql

99

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?

Oleg Pavliv
źródło
stackoverflow.com/questions/1074212/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

19

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.

John Montgomery
źródło
180

Scal następujący fragment z LOGGINGpolem w 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'],
        }
    }
}

Poprawiono z @ acardenas89 odpowiedź

Gian Marco
źródło
3
może być konieczne dodanie do handlerssekcji 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, },
Don Grem,
1
Potrzebowałem też 'version': 1,w LOGGINGdyktandzie.
Dan,
14
Pamiętaj, że DEBUG musi mieć wartość TRUE, aby dzienniki były faktycznie rejestrowane. Niezależnie od ustawień logowania.
Janusz Skonieczny
3
Aha, i jeszcze jedno żeby w django test runner ignorował ustawienia i overrides DEBUGna False, więc w teście trzeba@override_settings(DEBUG=True)
Janusz Skonieczny
7
Dodałbym również 'propagate': Falsepo '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.
Andrei-Niculae Petre
45

Dodaj następujące pogrubione stwierdzenia w settings.py


jeśli DEBUG:
    importowanie rejestrowania
    l = logging.getLogger ('django.db.backends')
    l.setLevel (logging.DEBUG)
    l.addHandler (logging.StreamHandler ())


LOGGING = {
    'wersja 1,
    'disable_existing_loggers': Fałsz,
    'filtry': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filtry': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }, 'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        } ,
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': prawda,
        }, „django.db.backends.sqlite3”: {
            'level': 'DEBUG',
            'handlers': ['console'],
        } ,
    }
}
  

Zasób / Kredyt

cevaris
źródło
9
Nie potrzebujesz zarówno ifoświadczenia u góry, jak i LOGGINGzmian. ifStwierdzenie 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 jest LOGGINGzmiana - i może dobrze chce django.db.backends, a nie jeden sqlite3 specyficzny.
M Somerville
Nie widzę żadnych zapytań na konsoli z uruchomionym django 1.9. DEBUG = True.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 To jest naprawdę stary komentarz, bardzo możliwe, że Django 1.9 nie obsługuje tego rozwiązania tak samo.
cevaris
W Django 1.9 DEBUGustawienie jest wymuszane na False podczas uruchamiania testów. Obejściem jest ponowne włączenie go w teście
Mouscellaneous
7

Aby rejestrować zapytania SQL podczas testowania, potrzebujesz dwóch rzeczy:

  1. django.db.backends rejestrator włączony i
  2. @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()
Janusz Skonieczny
źródło
2

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

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

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

Podziękowania dla odpowiedzi @Janusz Skonieczny!

vedant
źródło
0

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.

vdboor
źródło