2010-11-06 6 views

Répondre

0

Essayez le django debug toolbar. Il va vous montrer tout le SQL exécuté sur la demande. Quand quelque chose exécute beaucoup trop de requêtes, cela devient vraiment lent, cependant. Pour cela, je voulais essayer ce profiler. Cependant, j'ai roulé ce middleware sur deux projets:

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 

Il suffit d'aller à l'URL correspondant à la demande qui vous intéresse et ajouter un paramètre dbprofGET, vous verrez la sortie de profilage au lieu de la réponse normale.

+0

Stupide question ici, mais comment ajoutez-vous exactement "dbprof" à votre demande GET? Si je viens juste de le virer, je reçois une erreur "404 Page non trouvée" et Django se plaint de ne pas trouver l'URL dans urls.py. Devez-vous ajouter quelque chose à urls.py? – William

+0

Basé sur le code, je pense que vous devriez ajouter? Dbprof = True à la fin de l'URL – Omaraf

1

Eh bien, vous pouvez simplement définir le serveur pgsql pour consigner chaque requête. Ou juste pour enregistrer les plus lents. Regardez dans le fichier postgresql.conf, c'est assez proche de l'auto-documentation.

1

Vous pouvez décorer un gestionnaire de requête ou une autre fonction avec ceci et il imprimera le sql bien formé avec les totaux à la fin.

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 
Questions connexes