2011-10-14 51 views
26

當settings.DEBUG = True時,Django會將SQL操作記錄到內部緩衝區(無論是否記錄到文件)。因爲我有一個長時間運行的進程,執行很多數據庫操作,這會導致我的開發模式程序實例在內存消耗中增長得非常快。關閉SQL日誌記錄,同時保持settings.DEBUG?

我想禁用內部SQL日誌記錄機制,同時離開settings.DEBUG爲我的發展打開:這可能嗎?

Django版本1.3.0。

回答

23

當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即使記錄是關閉的。

+11

這是哪裏去的?如果我將它添加到settings.py中,我會得到以下'ImportError:由於django.db.backends import BaseDatabaseWrapper'試圖執行時環境變量DJANGO_SETTINGS_MODULE未定義,因此無法導入設置。 – Nathan

38

是的,您可以通過爲名爲'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語句的刺激性日誌記錄。布賴恩談到每個查詢的內部存儲器記錄(我想他是對的:-)

+0

很好的答案,這很容易,並且解決了DEBUG = True模式被SQL語句阻塞的日誌文件中最常見的問題。 – RichVel

+0

我正在使用的Django版本(1.9) - 而不是'處理程序':['null']我替換爲無所以'處理程序':無在Django> = 1.9,'django.utils.log.NullHandler'版本中的 – jonprasetyo

+2

不復存在。改爲使用'logging.NullHandler'。 – lsh

4

這個工作對我來說(至少對於Django的1.3.1):

from django.db import connection 
connection.use_debug_cursor = False 

我發現變量檢查Django的源代碼(它沒有記錄),相關線路在django/db/backends/__init__.pyBaseDatabaseWrapper類)發現:

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

如果仍然有興趣在跟蹤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 = []