отключить ведение журнала SQL, сохраняя настройки. Отладка? - PullRequest
26 голосов
/ 14 октября 2011

Django записывает операции SQL во внутренний буфер (будь то запись в файл или нет), когда settings.DEBUG = True.Поскольку у меня есть длительный процесс, который выполняет много операций с БД, это приводит к тому, что экземпляры программы в режиме разработки очень быстро увеличивают потребление памяти.оставив настройки. Отладка включена для моей разработки: это возможно?

Django версия 1.3.0.

Ответы [ 4 ]

42 голосов
/ 14 октября 2011

Да, вы можете отключить ведение журнала sql, назначив «нулевой обработчик» регистратору с именем «django.db.backends». Я предполагаю, что вы используете новую настройку ведения журнала на основе dict ? Если это так, этот фрагмент должен облегчить задачу:

    ...
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class':'logging.NullHandler',
            },
    ...
    'loggers': {
        ... your regular logger 'root' or '' ....
        'django.db.backends': {
            'handlers': ['null'],  # Quiet by default!
            'propagate': False,
            'level':'DEBUG',
            },
    ...

Обновление: посмотрите и на ответ Брайана. Я понял, что «логирование» означает раздражающее логирование каждого оператора SQL. Брайан говорит о регистрации внутренней памяти каждого запроса (и я думаю, он прав: -)

24 голосов
/ 14 октября 2011

Когда settings.EBUG имеет значение True, Django использует CursorDebugWrapper вместо CursorWrapper.Это то, что добавляет запросы к connection.queries и потребляет память.Я бы по-разному исправил оболочку подключения, чтобы всегда использовать CursorWrapper:

from django.conf import settings
from django.db.backends import BaseDatabaseWrapper
from django.db.backends.util import CursorWrapper

if settings.DEBUG:
    BaseDatabaseWrapper.make_debug_cursor = lambda self, cursor: CursorWrapper(cursor, self)

Отключение ведения журнала, как предлагают другие, не решит проблему, поскольку CursorDebugWrapper по-прежнему сохраняет запросы в connection.queries, даже если ведение журнала отключено.

4 голосов
/ 02 сентября 2013

Это сработало для меня (по крайней мере, для Django 1.3.1):

from django.db import connection
connection.use_debug_cursor = False

Я обнаружил, что переменная, проверяющая исходный код Django (она не задокументирована), соответствующие строки находятся в django/db/backends/__init__.py (BaseDatabaseWrapper класс):

def cursor(self):
    if (self.use_debug_cursor or
        (self.use_debug_cursor is None and settings.DEBUG)):
        cursor = self.make_debug_cursor(self._cursor())
    else:
        cursor = util.CursorWrapper(self._cursor(), self)
    return cursor
3 голосов
/ 11 декабря 2013

Если вы все еще заинтересованы в отслеживании операций SQL для целей отладки, вы также можете периодически очищать список connection.queries для освобождения памяти:

from django.db import connection

for i in range(start, count, size):
    objects = MyModel.objects.order_by('pk').all()[i:i + size]
    ...
    print connection.queries
    connection.queries = []
...