Jak uzyskać kod SQL, który Django będzie używać w bazie danych z obiektu QuerySet? Próbuję debugować dziwne zachowanie, ale nie jestem pewien, jakie zapytania trafiają do bazy danych. Dzięki za pomoc.Uzyskiwanie kodu SQL z Django QuerySet
Odpowiedz
Użytkownik drukuje atrybut zestawu zapytań o wartości query
.
>>> queryset = MyModel.objects.all()
>>> print queryset.query
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel"
Znalazłem [to] (https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#automatic-spatial-transformations), które wspomina o tym w sposób dorozumiany, ale nic, co wyraźnie nie dokumentuje powyższej uwagi. – hanleyhansen
wynik zapytania 'query' nie jest prawidłowym kodem SQL, ponieważ" Django nigdy właściwie nie interpoluje parametrów: wysyła zapytanie i parametry osobno do adaptera bazy danych, który wykonuje odpowiednie operacje. " Źródło: https://code.djangoproject.com/ticket/17741 – gregoltsov
gdzie muszę napisać zapytanie ... MyModel to klasa, która znajduje się w pliku models.py ... Moja wątpliwość to miejsce, w którym muszę napisać kwerendę sql dla pobierz wartość z tabeli. –
proste:
print my_queryset.query
Na przykład:
from django.contrib.auth.models import User
print User.objects.filter(last_name__icontains = 'ax').query
Należy również wspomnieć, że jeśli masz DEBUG = True, to wszystkie zapytania są rejestrowane i można uzyskać je, uzyskując dostęp do connection.queries:
from django.db import connections
connections['default'].queries
Projekt używa tego do przedstawienia zapytań na stronie w zgrabny sposób.
To nie zawsze wyprowadza prawidłowy kod SQL, zobacz inne odpowiedzi. – aehlke
Nie ma sposobu na uzyskanie rzeczywistego SQL bez wykonania pierwszego zapytania, ostateczny SQL jest generowany przez otaczający sterownik RDBMS, a nie Django. Odpowiedź jest poprawna, ponieważ jest najbardziej dostępna w Django QuerySet. – danigosa
Niniejsza middleware będzie wyjście każde zapytanie SQL do konsoli, z podświetlaniem kolorów oraz czasu realizacji, to było bezcenne dla mnie w optymalizacji bardziej skomplikowanych wnioski z
Jako alternatywę dla innych odpowiedzi, django-devserver wyprowadza SQL do konsoli.
The accepted answer nie działa dla mnie podczas używania Django 1.4.4. Zamiast zapytania surowego zwrócono referencję do obiektu zapytania: <django.db.models.sql.query.Query object at 0x10a4acd90>
.
Poniższa powrócił zapytania:
>>> queryset = MyModel.objects.all()
>>> queryset.query.__str__()
Prawdopodobnie nie działało, ponieważ właśnie wpisałeś 'queryset.query' zamiast' print queryset.query', które wywołuje '__str __()' – hughes
@ hughes ma rację. Jeśli nie chcesz drukować go i chcesz go jako ciąg, zamiast wywoływania '__str __()', aby uzyskać go jako ciąg, powinieneś zrobić 'str (queryset.query)'. – Chad
Używam ipdb do debugowania i wypisuje referencję do obiektu zapytania, gdy wykonuję 'p queryset'. 'p queryset .__ str __()' daje pożądany wynik, więc jest to lepsza odpowiedź. – Rafay
To nie jest duplikatem. powiązane pytanie to zupełnie inny temat. – craigds