Получение SQL из Django QuerySet

196

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

  • 3
    Это не дубликат. связанный вопрос - это совсем другая тема.
Теги:
django-queryset

5 ответов

296
Лучший ответ

Вы печатаете атрибут queryset query.

>>> queryset = MyModel.objects.all()
>>> print queryset.query
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel"
  • 0
    Я нашел то, что упоминает это неявно, но ничего, что явно документирует
  • 17
    Обратите внимание, что вывод query не является допустимым SQL, потому что «Django никогда не интерполирует параметры: он отправляет запрос и параметры отдельно в адаптер базы данных, который выполняет соответствующие операции». Источник: code.djangoproject.com/ticket/17741
Показать ещё 1 комментарий
48

Легко:

print my_queryset.query

Например:

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

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

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

django debug toolbar проект использует это, чтобы аккуратно представить запросы на странице.

  • 1
    Это не всегда выводит действительный SQL, смотрите другие ответы
  • 1
    Невозможно получить фактический SQL без предварительного выполнения запроса, окончательный SQL генерируется окружающим драйвером СУБД, а не Django. Ответ правильный, так как это максимум, что вы можете получить с помощью Django QuerySet.
23

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

После этого возвращается запрос:

>>> queryset = MyModel.objects.all()
>>> queryset.query.__str__()
  • 26
    Вероятно, это не сработало, потому что вы просто набрали queryset.query вместо print queryset.query , который вызывает __str__()
  • 10
    @ Хьюз прав. Если вы не хотите печатать его и хотите, чтобы он был в виде строки, вместо вызова __str__() чтобы получить его в виде строки, вам нужно выполнить str(queryset.query) .
Показать ещё 4 комментария
9

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

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

8

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню