當settings.DEBUG = True時,Django會將SQL操作記錄到內部緩衝區(無論是否記錄到文件)。因爲我有一個長時間運行的進程,執行很多數據庫操作,這會導致我的開發模式程序實例在內存消耗中增長得非常快。關閉SQL日誌記錄,同時保持settings.DEBUG?
我想禁用內部SQL日誌記錄機制,同時離開settings.DEBUG爲我的發展打開:這可能嗎?
Django版本1.3.0。
當settings.DEBUG = True時,Django會將SQL操作記錄到內部緩衝區(無論是否記錄到文件)。因爲我有一個長時間運行的進程,執行很多數據庫操作,這會導致我的開發模式程序實例在內存消耗中增長得非常快。關閉SQL日誌記錄,同時保持settings.DEBUG?
我想禁用內部SQL日誌記錄機制,同時離開settings.DEBUG爲我的發展打開:這可能嗎?
Django版本1.3.0。
當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即使記錄是關閉的。
是的,您可以通過爲名爲'django.db.backends'的記錄器分配'空處理程序'來安靜地記錄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的回答了。我將「logging」理解爲意味着每個sql語句的刺激性日誌記錄。布賴恩談到每個查詢的內部存儲器記錄(我想他是對的:-)
很好的答案,這很容易,並且解決了DEBUG = True模式被SQL語句阻塞的日誌文件中最常見的問題。 – RichVel
我正在使用的Django版本(1.9) - 而不是'處理程序':['null']我替換爲無所以'處理程序':無在Django> = 1.9,'django.utils.log.NullHandler'版本中的 – jonprasetyo
不復存在。改爲使用'logging.NullHandler'。 – lsh
這個工作對我來說(至少對於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
如果仍然有興趣在跟蹤SQL操作進行調試,你也可以乾淨connection.queries名單定期收回成員ory:
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 = []
這是哪裏去的?如果我將它添加到settings.py中,我會得到以下'ImportError:由於django.db.backends import BaseDatabaseWrapper'試圖執行時環境變量DJANGO_SETTINGS_MODULE未定義,因此無法導入設置。 – Nathan