当settings.DEBUG = True时,Django将SQL操作记录到内部缓冲区(无论是否记录到文件)。因为我有长时间运行的进程来执行大量的数据库操作,所以这会导致程序的开发模式实例在内存消耗中迅速增长。
我想禁用内部SQL日志记录机制,同时为我的开发启用了settings.DEBUG:这可能吗?
Django 1.3.0版。
答案 0 :(得分:42)
是的,你可以通过为名为'django.db.backends'的记录器分配'null handler'来安静sql记录。我假设你使用django's new dict-based logging setup?如果是这样,这个片段应该很容易:
...
'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',
},
...
更新:也看看Brian的回答。我理解“日志记录”是指每个sql语句的恼人记录。 Brian谈到每个查询的内部内存记录(我猜他是对的: - )
答案 1 :(得分:24)
当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 :(得分:4)
这对我有用(至少对于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 :(得分:3)
如果仍然有兴趣跟踪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 = []