2010-11-06 71 views

回答

0

試試django debug toolbar。它會向您顯示通過請求執行的所有SQL。當某些事情執行太多查詢時,它變得非常慢。爲此,我一直在嘗試這個profiler。不過,我已經駛上了幾個項目,這個中間件:

try: 
    from cStringIO import StringIO 
except ImportError: 
    import StringIO 
from django.conf import settings 
from django.db import connection 

class DatabaseProfilerMiddleware(object): 
    def can(self, request): 
     return settings.DEBUG and 'dbprof' in request.GET 

    def process_response(self, request, response): 
     if self.can(request): 
      out = StringIO() 
      out.write('time  sql\n') 
      total_time = 0 
      for query in reversed(sorted(connection.queries, key=lambda x: x['time'])): 
       total_time += float(query['time'])*1000 
       out.write('%s %s\n' % (query['time'], query['sql'])) 
      response.content = '<pre style=&quot;white-space:pre-wrap&quot;>%d queries executed in %.3f seconds\n%s</pre>' \ 
       % (len(connection.queries), total_time/1000, out.getvalue()) 
     return response 

只要到你感興趣的請求的相關網址,並添加dbprofGET參數,你會看到剖析輸出,而不是正常的迴應。

+0

這裏有個愚蠢的問題,但是如何在GET請求中添加「dbprof」?如果我剛剛解決這個問題,我會得到一個「404頁面未找到」的錯誤,Django會抱怨它無法在urls.py中找到該URL。你需要添加一些東西到urls.py? – William 2015-01-31 21:41:00

+0

根據代碼,我認爲你必須在url結尾添加?dbprof = True – Omaraf 2016-02-21 19:36:43

1

那麼,你可以設置pgsql服務器來記錄每個查詢。或者只是記錄慢的。查看postgresql.conf文件,它非常接近自我記錄。

1

你可以用這個裝飾一個請求處理程序或其他函數,它會在最後打印出合適的格式的總數。

from functools import wraps 
from django.utils import termcolors 
format_ok = termcolors.make_style(opts=('bold',), fg='green') 
format_warning = termcolors.make_style(opts=('bold',), fg='yellow') 
format_error = termcolors.make_style(opts=('bold',), fg='red') 

try: 
    from pygments import highlight 
    from pygments.lexers import SqlLexer 
    from pygments.formatters import TerminalFormatter 
    pygments_sql_lexer = SqlLexer() 
    pygments_terminal_formatter = TerminalFormatter() 
    highlight_sql = lambda s: highlight(s, pygments_sql_lexer, 
           pygments_terminal_formatter) 
except ImportError: 
    highlight_sql = lambda s: s 


def debug_sql(f): 
    """ 
    Turn SQL statement debugging on for a test run. 
    """ 
    @wraps(f) 
    def wrapper(*a, **kw): 
     from django.conf import settings 
     from django.db import connection 
     try: 
      debug = settings.DEBUG 
      settings.DEBUG = True 
      connection.queries = [] 
      return f(*a, **kw) 
     finally: 
      total_time = 0 
      for q in connection.queries: 
       fmt = format_ok 
       t = float(q['time']) 
       total_time += t 
       if t > 1: 
        fmt = format_error 
       elif t > 0.3: 
        fmt = format_warning 
       print '[%s] %s' % (fmt(q['time']), highlight_sql(q['sql'])) 
      print "total time =", total_time 
      print "num queries =", len(connection.queries) 
      settings.DEBUG = debug 
    return wrapper 
相關問題