Отключить ведение журнала SQL при сохранении настроек .DEBUG?
Django регистрирует операции SQL во внутреннем буфере (независимо от того, записывается ли файл в файл или нет), когда settings.DEBUG = True. Поскольку у меня есть длительный процесс, который выполняет много операций с БД, это приводит к тому, что мои экземпляры режима разработки программы быстро растут в потреблении памяти.
Я хотел бы отключить внутренний механизм регистрации SQL, оставив настройки .DEBUG включен для моего развития: возможно ли это?
Django версии 1.3.0.
Ответы
Ответ 1
Когда settings.DEBUG имеет значение 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, даже если протоколирование отключено.
Ответ 2
Да, вы можете отключить запись в sql, назначив "нулевой обработчик" регистратору с именем "django.db.backends". Я предполагаю, что вы используете django новую настройку регистрации на основе диктофона? Если это так, этот сниппет должен облегчить:
...
'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. Брайан рассказывает о записи внутренней памяти каждого запроса (и я думаю, он прав: -)
Ответ 3
Это сработало для меня (по крайней мере, для Django 1.3.1):
from django.db import connection
connection.use_debug_cursor = False
Я обнаружил, что переменная, проверяющая исходный код Django (она не документирована), соответствующие строки находятся в django/db/backends/__init__.py
(BaseDatabaseWrapper
class):
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
Ответ 4
Если вы все еще заинтересованы в отслеживании операций SQL для целей отладки, вы также можете периодически очищать список соединений. reeries для восстановления памяти:
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 = []