Django: показывать / регистрировать ORM sql вызовы из оболочки Python - PullRequest
51 голосов
/ 23 февраля 2010

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

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

Ответы [ 7 ]

182 голосов
/ 29 апреля 2011

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

import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
29 голосов
/ 23 февраля 2010

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * также она также включает в себя .

26 голосов
/ 22 мая 2015

Я пытался использовать " Django: show / log ORM sql вызывает из оболочки Python " в оболочке на рабочем сервере, и она не работала. В конце концов кто-то указал, что он будет делать эту отладку только тогда, когда 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())

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

18 голосов
/ 22 марта 2016

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

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

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

11 голосов
/ 23 февраля 2010

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

query.as_sql()

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

е

MyModel.objects.all().query.as_sql()
6 голосов
/ 01 апреля 2011
qs = YourModel.objects.all()

qs.query.get_compiler('default').as_sql()
5 голосов
/ 15 ноября 2010

Если вы действительно серьезно относитесь к желанию видеть / регистрировать все SQL-запросы, вы можете попробовать Django 1.3 (в настоящее время в альфа-версии, но скоро будет производственным), который позволяет Python logger для многих компоненты, включая базу данных.

Конечно, если вы застряли в стабильной версии 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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...