获取Django在PostgreSQL上运行的所有查询

4

我正在开发一个基于django和postgresql的项目,需要查看每次django在数据库上运行的查询语句(以便我可以优化查询)。有没有一种方法可以获取这些查询语句。 更新:我的开发环境是ubuntu linux。

4个回答

1
您可以使用此功能装饰请求处理程序或其他函数,它将以漂亮的格式打印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

1

你可以将pgsql服务器设置为记录每个查询,或者只记录慢查询。在postgresql.conf文件中查找,它非常接近自我记录。


1

0

尝试使用Django调试工具栏。它会显示请求期间执行的所有SQL语句。当某些操作执行了太多查询时,速度会变得非常慢。为此,我一直想尝试这个分析器。然而,我已经在几个项目中使用了这个中间件:

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,并添加一个dbprofGET参数,您将看到分析输出而不是正常响应。

这里有一个愚蠢的问题,你如何将“dbprof”添加到你的GET请求中?如果只是简单地加上它,我会收到“404页面找不到”的错误,并且Django会抱怨在urls.py中找不到该URL。你需要在urls.py中添加一些东西吗? - Jim
根据代码,我认为你需要在URL末尾添加?dbprof=True。 - Omaraf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接