代码之家  ›  专栏  ›  技术社区  ›  Roy Tang

django-是否有查看ORM正在执行的查询的方法?[副本]

  •  0
  • Roy Tang  · 技术社区  · 15 年前

    这个问题已经有了答案:

    比如,他们登录到控制台了吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Meitham    15 年前

    我通常用 http://github.com/robhudson/django-debug-toolbar 它告诉您查询的位置以及实际执行查询所需的时间。

        2
  •  1
  •   Community Mohan Dere    9 年前

    当然。从命令行/shell:

    queryset = Model.objects.filter()
    print queryset.query
    

    变体2:

    from django.db import connection    
    queryset = Model.objects.filter()
    queryset[0] # This variant needs the queryset to be accessed. Hence.
    print connection.queries
    

    如果要打印用于呈现页面的查询,则可以使用工具栏作为@meitham suggested 或者用这个 Django snippet .

        3
  •  1
  •   Skylar Saveland    14 年前

    您可以用这个来修饰一个请求处理程序或其他函数,它将打印出最终用总计很好地格式化的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