2010-09-20 4 views
219

Как получить SQL, который Django будет использовать в базе данных из объекта QuerySet? Я пытаюсь отладить какое-то странное поведение, но я не уверен, какие запросы идут в базу данных. Спасибо за вашу помощь.Получение SQL из QuerySet Django

+1

Это не является дубликатом. связанный вопрос - совсем другая тема. – craigds

ответ

331

Вы печатаете атрибут запроса query.

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

Я нашел [это] (https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#automatic-spatial-transformations), который упоминает его неявно, но ничего, что явно документирует выше – hanleyhansen

+10

. Обратите внимание, что вывод 'query' недействителен SQL, потому что« Django никогда не интерполирует параметры: он отправляет запрос и параметры отдельно к адаптеру базы данных, который выполняет соответствующие операции ». Источник: https://code.djangoproject.com/ticket/17741 – gregoltsov

+0

, где мне нужно написать запрос ... MyModel - это класс, который находится в файле models.py ... Мое сомнение в том, где я должен писать sql-запрос для извлекать значение из таблицы. –

48

Easy:

print my_queryset.query 

Например:

from django.contrib.auth.models import User 
print User.objects.filter(last_name__icontains = 'ax').query 

Следует также отметить, что если у вас есть DEBUG = True, то все ваши запросы регистрируются, и вы можете получить их, обратившись к connection.query:

from django.db import connections 
connections['default'].queries 

Проект django debug toolbar использует это для удобного представления запросов на странице.

+1

Это не всегда выводит правильный SQL, см. Другие ответы – aehlke

+1

Невозможно получить фактический SQL без выполнения запроса вначале, окончательный SQL генерируется окружающим драйвером RDBMS, а не Django. Ответ правильный, так как это самое большее, что вы можете получить с Django QuerySet. – danigosa

9

Это промежуточное ПО будет выводить каждый SQL-запрос к консоли, с цветом подсветкой и временем выполнения, это было бесценным для меня в оптимизации некоторых скользких Спросов

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

8

В качестве альтернативы других ответов, django-devserver выводит SQL на консоль.

26

The accepted answer не работал для меня при использовании Django 1.4.4. Вместо необработанного запроса была возвращена ссылка на объект Query: <django.db.models.sql.query.Query object at 0x10a4acd90>.

Следующая вернула запрос:

>>> queryset = MyModel.objects.all() 
>>> queryset.query.__str__() 
+23

Возможно, это не сработало, потому что вы просто набрали 'queryset.query' вместо' print queryset.query', который вызывает '__str __()' – hughes

+7

@hughes. Если вы не хотите печатать его и хотите, чтобы он был как строка, вместо вызова '__str __()', чтобы получить его как строку, вы должны сделать 'str (queryset.query)'. – Chad

+1

Я использую ipdb для отладки, и он печатает ссылку на объект запроса, когда я делаю 'p queryset'. 'p queryset .__ str __()' создает желаемый результат, поэтому это лучший ответ. – Rafay