2010-09-20 25 views
219

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

+1

To nie jest duplikatem. powiązane pytanie to zupełnie inny temat. – craigds

Odpowiedz

331

Użytkownik drukuje atrybut zestawu zapytań o wartości query.

>>> queryset = MyModel.objects.all() 
>>> print queryset.query 
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel" 
+0

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

+10

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

+0

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. –

48

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.

+1

To nie zawsze wyprowadza prawidłowy kod SQL, zobacz inne odpowiedzi. – aehlke

+1

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

9

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

http://djangosnippets.org/snippets/290/

26

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__() 
+23

Prawdopodobnie nie działało, ponieważ właśnie wpisałeś 'queryset.query' zamiast' print queryset.query', które wywołuje '__str __()' – hughes

+7

@ 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

+1

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

Powiązane problemy