【问题标题】:Getting all queries that django run on postgresql获取 django 在 postgresql 上运行的所有查询
【发布时间】:2011-05-06 03:41:04
【问题描述】:

我正在开发一个 django-postgresql 项目,我需要查看 django 在数据库上运行的每个查询(这样我就可以微调查询)。有没有办法获得这些查询。 更新:我的开发环境是在ubuntu linux上

【问题讨论】:

    标签: django postgresql logging


    【解决方案1】:

    好吧,您可以将 pgsql 服务器设置为记录每个查询。或者只是记录慢的。查看 postgresql.conf 文件,它非常接近自文档化。

    【讨论】:

      【解决方案2】:

      查看这个问题(以及两个最热门的答案): django orm, how to view (or log) the executed query?

      您还可以查看 Djando 文档: https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

      希望这会有所帮助, 安东

      【讨论】:

        【解决方案3】:

        你可以用它来装饰一个请求处理程序或其他函数,它会在最后打印出格式正确的 sql。

        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
        

        【讨论】:

          【解决方案4】:

          试试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
          

          只需转到您感兴趣的请求的相关 URL 并添加 dbprof GET 参数,您将看到分析输出而不是正常响应。

          【讨论】:

          • 这里是个愚蠢的问题,但是您究竟如何将“dbprof”添加到您的 GET 请求中?如果我只是添加它,我会收到“404 Page not found”错误,并且 Django 抱怨它在 urls.py 中找不到 URL。你必须在 urls.py 中添加一些东西吗?
          • 根据代码,我认为您必须在 url 末尾添加 ?dbprof=True
          猜你喜欢
          • 1970-01-01
          • 2011-01-06
          • 2013-01-31
          • 1970-01-01
          • 2019-10-07
          • 2019-03-17
          • 1970-01-01
          • 1970-01-01
          • 2020-10-27
          相关资源
          最近更新 更多