Ответ 1
Если вы находитесь в оболочке или где угодно, вы можете использовать метод queryset
query.as_sql()
для печати команды SQL.
т
MyModel.objects.all().query.as_sql()
Использование превосходного Django-Devserver Я нахожу всевозможные интересные и неожиданные вызовы SQL в моем коде. Я хотел найти, откуда идут вызовы, и поэтому я ищу способ получить журнал или распечатку всех вызовов SQL, созданных Django ORM в оболочке Python. То есть, когда я делаю вызов ORM Django через оболочку Python, я бы хотел, чтобы полученный SQL-результат был распечатан или зарегистрирован.
Я заметил несколько решений, которые добавляют информацию журнала на страницу html. Есть ли простой способ сбросить в командной строке?
Если вы находитесь в оболочке или где угодно, вы можете использовать метод queryset
query.as_sql()
для печати команды SQL.
т
MyModel.objects.all().query.as_sql()
Если вы используете Django 1.3:
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
Роб Хадсон Панель инструментов Django Debug, а также ее общая удивительность, также включает довольно изящную команду debugsqlshell
manage.py, которая точно это.
Я пытался использовать Django: show/log ORM sql calls from python shell" в оболочке на рабочем сервере, и он не работал. В конце концов кто-то указал, что он выполнит эту регистрацию отладки только при DEBUG = True
. Но вы можете обойти это так:
import logging
from django.db import connection
connection.force_debug_cursor = True # Change to use_debug_cursor in django < 1.8
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
Я оставляю это здесь, поэтому я могу найти его позже, и, надеюсь, это спасет кого-то еще того же копания, что и я.
Используйте расширения django.
pip install django-extensions
./manage.py shell_plus --print-sql
В производственных средах это может не работать из-за настроек отладки.
qs = YourModel.objects.all()
qs.query.get_compiler('default').as_sql()
Если вы действительно серьезно относитесь к тому, чтобы видеть/регистрировать все SQL-запросы, вам нужно попробовать Django 1.3 (в настоящее время в альфа, но вскоре это будет производство), что позволяет Python loggers для многих компонентов, включая базы данных.
Конечно, если вы застряли с использованием стабильной версии Django, вы можете получить такой же эффект относительно легко, исправив django/db/models/sql/compiler.py
, добавив это в нижнюю часть списка импорта:
import logging
_querylogger = logging.getLogger( 'sql.compiler' )
Найти метод SQLCompiler::execute_sql()
и изменить:
cursor = self.connection.cursor()
cursor.execute( sql, params )
:
cursor = self.connection.cursor()
_querylogger.info( "%s <= %s", sql, params )
cursor.execute( sql, params )