【问题标题】:How to view corresponding SQL query of the Django ORM's queryset?如何查看Django ORM的查询集对应的SQL查询?
【发布时间】:2010-11-01 13:58:30
【问题描述】:

有没有办法打印 Django ORM 正在生成的查询?

假设我执行以下语句:Model.objects.filter(name='test')

如何查看生成的 SQL 查询?

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    每个 QuerySet 对象都有一个 query 属性,您可以将其记录或打印到标准输出以进行调试。

    qs = Model.objects.filter(name='test')
    print(qs.query)
    

    请注意,在 pdb 中,使用 p qs.query 将无法正常工作,但 print(qs.query) 会。

    如果这不起作用,对于旧 Django 版本,请尝试:

    print str(qs.query)
    

    编辑

    我还使用自定义模板标签(如this snippet 中所述)将查询注入到单个请求范围内作为 HTML cmets。

    【讨论】:

    • .save() 的查询呢?
    • @DataGreed 好问题,可能值得在新线程中提问,以便您获得更多回复。
    • 它是否适用于prefetch_related,即显示 2 个查询?我只看到 1 个。
    • 不起作用。我看到<django.db.models.sql.query.Query object
    • 尝试打印(str(qs.query))。我认为他们在 10 年内改变了一些内部结构
    【解决方案2】:

    您还可以使用 python 日志记录 Django 生成的所有查询。只需将其添加到您的设置文件中即可。

    LOGGING = {
        'disable_existing_loggers': False,
        'version': 1,
        'handlers': {
            'console': {
                # logging handler that outputs log messages to terminal
                'class': 'logging.StreamHandler',
                'level': 'DEBUG', # message level to be written to console
            },
        },
        'loggers': {
            '': {
                # this sets root level logger to log debug and higher level
                # logs to console. All other loggers inherit settings from
                # root level logger.
                'handlers': ['console'],
                'level': 'DEBUG',
                'propagate': False, # this tells logger to send logging message
                                    # to its parent (will send if set to True)
            },
            'django.db': {
                # django also has database level logging
                'level': 'DEBUG'
            },
        },
    }
    

    如果应用程序生成 html 输出的另一种方法 - 可以使用 django debug toolbar

    【讨论】:

    【解决方案3】:

    您可以将此代码粘贴到您的 shell 上,这将显示所有 SQL 查询:

    # To get all sql queries sent by Django from py shell
    import logging
    l = logging.getLogger('django.db.backends')
    l.setLevel(logging.DEBUG)
    l.addHandler(logging.StreamHandler())
    

    【讨论】:

      【解决方案4】:

      只要DEBUG 处于开启状态:

      from django.db import connection
      print(connection.queries)
      

      对于单个查询,您可以:

      print(Model.objects.filter(name='test').query)
      

      【讨论】:

        【解决方案5】:

        也许你应该看看django-debug-toolbar 应用程序,它会为你记录所有查询,显示他们的分析信息等等。

        【讨论】:

        • 这非常有用,但它只适用于 GUI,有时您想直接在 ORM 中查看查询日志。例如你有一个没有 GUI 的 api!
        【解决方案6】:

        一个可靠的解决方案是让您的数据库服务器记录到一个文件,然后

        tail -f /path/to/the/log/file.log
        

        【讨论】:

          【解决方案7】:

          如果您使用数据库路由,您可能有多个数据库连接。 像这样的代码可以让您查看会话中的连接。 您可以像使用单个连接一样重置统计信息:reset_queries()

          from django.db import connections,connection,reset_queries
          ...
          reset_queries()  # resets data collection, call whenever it makes sense
          

          ...

          def query_all():
              for c in connections.all():
                  print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")
          
          # and if you just want to count the number of queries
          def query_count_all()->int:
              return sum(len(c.queries) for c in connections.all() )
          

          【讨论】:

            【解决方案8】:

            您可以使用 Django debug_toolbar 来查看 SQL 查询。 debug_toolbar 使用分步指南:

            安装 Debug_toolbar

            pip install django-debug-toolbar
            

            编辑 settings.py 文件并将 debug_toolbar 添加到已安装的应用程序中,这应该添加到下面的 'django.contrib.staticfiles' 中。还将 debug_toolbar 添加到中间件。

            Settings.py=>

            INSTALLED_APPS= [ 'debug_toolbar'] 
            
            MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
            

            在 settings.py 文件中创建一个名为 INTERNAL_IPS 的新列表

            Settings.py=> 在 settings.py 文件末尾创建新列表并添加以下列表:

            INTERNAL_IPS= [127.0.0.1']
            

            这将允许调试仅在内部开发服务器上运行

            编辑#Project的urls.py文件并添加以下代码:

            if settings.DEBUG:
                import debug_toolbar
                urlpatterns = [
                url(r'^__debug__/', include(debug_toolbar.urls))       
                ] + urlpatterns
            

            再次申请迁移并运行服务器

            您将在网页上的 127.0.0.1 上看到一个附加组件,如果您单击 SQL Query 复选框,您实际上也可以看到查询的运行时间。

            【讨论】:

              猜你喜欢
              • 2011-06-01
              • 2020-08-03
              • 2021-07-25
              • 1970-01-01
              • 1970-01-01
              • 2023-03-03
              • 2018-05-15
              • 2019-10-17
              • 2016-04-20
              相关资源
              最近更新 更多