Czy istnieje sposób pokazania kodu SQL uruchomionego przez Django podczas wykonywania zapytania?
307
Zobacz często zadawane pytania dotyczące dokumentacji: „ Jak mogę zobaczyć surowe zapytania SQL, które uruchamia Django? ”
django.db.connection.queries
zawiera listę zapytań SQL:
from django.db import connection
print(connection.queries)
Zestawy zapytań mają również query
atrybut zawierający zapytanie do wykonania:
print(MyModel.objects.filter(name="my name").query)
Zauważ, że wynik zapytania nie jest prawidłowym SQL, ponieważ:
„Django nigdy nie interpoluje parametrów: wysyła zapytanie i parametry osobno do adaptera bazy danych, który wykonuje odpowiednie operacje.”
Z raportu o błędzie Django # 17741 .
Z tego powodu nie należy wysyłać wyników zapytania bezpośrednio do bazy danych.
str()
funkcji języka Python , która wywołuje__str__()
metodę wewnętrzną . np.str(MyModel.objects.filter(name="my name").query)
Poleciłbym również użycie IPython i powłoki Django twojego projektu. Uzupełnianie tabulatorów zapewnia introspekcję obiektu. Ponieważ Django znany jest z asertywnych schematów nazewnictwa, ta metodologia jest zwykle bardzo przydatna.query
nie jest poprawnym SQL, ponieważ „Django nigdy nie interpoluje parametrów: wysyła zapytanie i parametry osobno do adaptera bazy danych, który wykonuje odpowiednie operacje”. Źródło: code.djangoproject.com/ticket/17741stable
, a niedev
, żeby dodać odnośnik do bieżącej wersji Django tak: docs.djangoproject.com/en/stable/faq/models/...Rozszerzenia Django mają polecenie shell_plus z parametrem
print-sql
W powłoce django zostaną wydrukowane wszystkie wykonane zapytania
Dawny.:
źródło
Spójrz na debug_toolbar , jest to bardzo przydatne do debugowania.
Dokumentacja i źródło są dostępne na stronie http://django-debug-toolbar.readthedocs.io/ .
źródło
źródło
m = MyModel.objects.get(...)
następujem.query
m
nie jest już zestawem zapytań. Zastosowanieq = MyModel.objects.filter(...)
, a następnieq.query
, po czymm = q.get()
.Żadna inna odpowiedź nie obejmuje tej metody, więc:
Uważam, że najbardziej użyteczną, prostą i niezawodną metodą jest zapytanie bazy danych. Na przykład w systemie Linux dla Postgres możesz:
Każda baza danych będzie miała nieco inną procedurę. W dziennikach bazy danych zobaczysz nie tylko nieprzetworzony kod SQL, ale także wszelkie ustawienia połączenia lub transakcji narzucone przez django w systemie.
źródło
log_statement='all'
siępostgresql.conf
na tej metodzie.postgresql.conf
, biegającpsql -U postgres -c 'SHOW config_file'
Chociaż możesz to zrobić za pomocą dostarczonego kodu, uważam, że korzystanie z aplikacji paska narzędzi debugowania jest doskonałym narzędziem do wyświetlania zapytań. Możesz pobrać go z github tutaj .
Daje to opcję pokazania wszystkich zapytań uruchomionych na danej stronie wraz z czasem potrzebnym na zapytanie. Podsumowuje także liczbę zapytań na stronie oraz całkowity czas na szybką recenzję. To świetne narzędzie, gdy chcesz zobaczyć, co robi Django ORM za kulisami. Ma również wiele innych fajnych funkcji, z których możesz skorzystać, jeśli chcesz.
źródło
Inna opcja, patrz opcje rejestrowania w pliku settings.py opisane w tym poście
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar spowalnia każde ładowanie strony na serwerze deweloperskim, logowanie nie jest tak szybsze. Dane wyjściowe można zrzucić do konsoli lub pliku, więc interfejs użytkownika nie jest tak przyjemny. Ale w przypadku widoków z dużą ilością SQL-ów debugowanie i optymalizacja SQLów przez debug_toolbar może zająć dużo czasu, ponieważ ładowanie każdej strony jest tak wolne.
źródło
Jeśli upewnisz się, że plik settings.py ma:
django.core.context_processors.debug
wymienione wCONTEXT_PROCESSORS
DEBUG=True
IP
wINTERNAL_IPS
krotcePowinieneś mieć dostęp do
sql_queries
zmiennej. Do każdej strony, która wygląda tak, dołączam stopkę:Mam zmienną
sql_time_sum
, dodając liniędo funkcji debugowania w django_src / django / core / context_processors.py.
źródło
W tym celu opracowałem rozszerzenie, dzięki czemu można łatwo umieścić dekorator w funkcji widoku i zobaczyć, ile zapytań jest wykonywanych.
Żeby zainstalować:
Aby użyć jako menedżera kontekstu:
Aby użyć jako dekoratora:
Github: https://github.com/rabbit-aaron/django-print-sql
źródło
Uważam, że powinno to działać, jeśli używasz PostgreSQL:
źródło
Poniższe zwraca zapytanie jako poprawny SQL na podstawie https://code.djangoproject.com/ticket/17741 :
źródło
Zrobiłem mały fragment, którego możesz użyć:
Jako parametr przyjmuje (funkcja kwerend SQL) kontrolę i argumenty, kwargs potrzebne do wywołania tej funkcji. W rezultacie zwraca, która funkcja zwraca, i drukuje zapytania SQL w konsoli.
źródło
Umieszczam tę funkcję w pliku util w jednej z aplikacji w moim projekcie:
Następnie, w razie potrzeby, po prostu importuję go i wywołuję z dowolnego kontekstu (zwykle widok), na przykład:
Fajnie jest robić to poza szablonem, ponieważ wtedy, jeśli masz widoki API (zwykle Django Rest Framework), ma to również zastosowanie.
źródło
W przypadku Django 2.2:
Ponieważ większość odpowiedzi niewiele mi pomogła podczas korzystania
./manage.py shell
. W końcu znalazłem odpowiedź. Mam nadzieję, że to komuś pomoże.Aby wyświetlić wszystkie zapytania:
Aby wyświetlić zapytanie dla pojedynczego zapytania:
q.query
po prostu wyświetlam obiekt dla mnie. Za pomocą__str__()
(reprezentacja ciągu) wyświetlono pełne zapytanie.źródło
Przeglądaj zapytania za pomocą django.db.connection.queries
Uzyskaj dostęp do surowego zapytania SQL na obiekcie QuerySet
źródło
Wystarczy dodać w django, jeśli masz zapytanie takie jak:
zrobić:
aby uzyskać ciąg SQL
źródło