2011-10-14 18 views
26

Django, settings.EBUG = True olduğunda, SQL işlemlerini bir dahili arabelleğe (dosyaya giriş yapıp yapmamak) kaydeder. Çok fazla DB işlemi yapan uzun süren işlemim olduğundan, bu durum programın geliştirme modu örneklerinin bellek tüketiminde çok hızlı bir şekilde büyümesine neden oluyor., ayarları kaydederken SQL günlük kaydını kapatabilir.DEBUG?

Ayarlardan çıkarken dahili SQL günlüğü mekanizmasını devre dışı bırakmak istiyorum.DEBUG geliştirmemi etkinleştirdi: Bu mümkün mü?

Django sürüm 1.3.0.

cevap

23

Ayarlar.DEBUG True olduğunda, Django CursorWrapper yerine CursorDebugWrapper kullanır. Bu, bağlantılara sorgular ekleyen nedir? Sorgular ve bellek tüketir. Hep CursorWrapper kullanmak bağlantı sarıcı maymun yama olacaktır:

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) 

diğerleri gibi giriş devre dışı bırakılması sorunu çözmek değil önermek, CursorDebugWrapper hala günlüğü kapalıysa bile connection.queries sorguları saklar çünkü.

+11

Bu nereye? Bunu settings.py dosyasına eklerseniz aşağıdaki 'ImportError'ı alırım: Ayarlar, '' django.db.backends import BaseDatabaseWrapper '' komutunu çalıştırmaya çalışırken DJANGO_SETTINGS_MODULE ortam değişkeninin undefined.' olması nedeniyle içe aktarılamıyor. – Nathan

38

Evet, 'django.db.backends' adlı kaydediciye 'boş bir işleyici' atayarak, günlüğe kaydetme sırasını susturabilirsiniz. django's new dict-based logging setup'u kullandığını var mı? Eğer öyleyse, bu pasajı kolay yapmak gerektiğini:

... 
    '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', 
      }, 
    ... 

Güncelleme: çok Brian'ın cevaba görünümü. Her sql ifadesinin rahatsız edici günlüğü anlamına gelmek için "günlüğe kaydetme" yi anladım. Brian her sorgunun dahili bellek günlük bahsediyor (ve onun haklı :-)

+0

büyük yanıt, bu çok daha kolay ve en sık karşılaşılan günlük dosyalarının DEBUG = Gerçek modda SQL deyimleri ile tıkanıklık sorunu giderir. – RichVel

+0

Kullanmakta olduğum Django sürümü (1.9) - 'işleyicileri' yerine: ['null'] Hiçbiri 'işleyici' ile değiştirilmedim: Hiçbiri – jonprasetyo

+2

Django sürümlerinde = 1.9, 'django.utils.log.NullHandler' artık yok. Bunun yerine 'logging.NullHandler' kullanın. – lsh

4

Bu en azından Django 1.3.1 için (benim için çalıştı) sanırım:

from django.db import connection 
connection.use_debug_cursor = False 

Ben değişken olduğunu tespit ettik (bu belgelenmiş değildir) Django kaynak kodunu teftiş, ilgili hatlar django/db/backends/__init__.py (BaseDatabaseWrapper sınıfında) bulunur:

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

hata ayıklama amacıyla SQL işlemlerini izleme hala ilgi varsa, periyodik da yapabilirsiniz temiz connection.queries listesi memelemek 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 = [] 
İlgili konular