Django: показывать/регистрировать вызовы ORM sql из оболочки python

Использование превосходного Django-Devserver Я нахожу всевозможные интересные и неожиданные вызовы SQL в моем коде. Я хотел найти, откуда идут вызовы, и поэтому я ищу способ получить журнал или распечатку всех вызовов SQL, созданных Django ORM в оболочке Python. То есть, когда я делаю вызов ORM Django через оболочку Python, я бы хотел, чтобы полученный SQL-результат был распечатан или зарегистрирован.

Я заметил несколько решений, которые добавляют информацию журнала на страницу html. Есть ли простой способ сбросить в командной строке?

Ответ 1

Если вы находитесь в оболочке или где угодно, вы можете использовать метод queryset

query.as_sql()

для печати команды SQL.

т

MyModel.objects.all().query.as_sql()

Ответ 2

Если вы используете Django 1.3:

import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())

Ответ 3

Роб Хадсон Панель инструментов Django Debug, а также ее общая удивительность, также включает довольно изящную команду debugsqlshell manage.py, которая точно это.

Ответ 4

Я пытался использовать 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())

Я оставляю это здесь, поэтому я могу найти его позже, и, надеюсь, это спасет кого-то еще того же копания, что и я.

Ответ 5

Используйте расширения django.

pip install django-extensions
./manage.py shell_plus --print-sql

В производственных средах это может не работать из-за настроек отладки.

Ответ 6

qs = YourModel.objects.all()

qs.query.get_compiler('default').as_sql()

Ответ 7

Если вы действительно серьезно относитесь к тому, чтобы видеть/регистрировать все 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 )