【问题标题】:Django - is there a way to view the queries being executed by the ORM? [duplicate]Django - 有没有办法查看 ORM 正在执行的查询? [复制]
【发布时间】:2011-04-13 06:08:38
【问题描述】:

例如,他们是否已登录到控制台?

【问题讨论】:

    标签: django


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      当然。从命令行/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】:

        你可以用它来装饰一个请求处理程序或其他函数,它会在最后打印出格式正确的 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
        

        【讨论】:

          猜你喜欢
          • 2018-06-02
          • 2021-10-06
          • 2015-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-03
          • 2021-06-20
          相关资源
          最近更新 更多