【问题标题】:How to see queries run by Django ORM?如何查看 Django ORM 运行的查询?
【发布时间】:2020-08-03 10:11:08
【问题描述】:

我在settings.py 文件中有DEBUD = True。我用 django 配置了MySQL 数据库。我在courses/models.py 中有一个Course 模型。在courses/views.py,我有:

@api_view(['GET'])
def courses_list(request):
  courses = Course.objects.all()
  serializer = CourseSerializer(courses, many=True)
  return Response(serializer.data)

现在,如果我向 Postman 提出请求以点击此视图,我认为必须执行一些像 SELECT * FROM COURSES 这样的查询。当我向某个后端 URL 发出请求时,如何查看执行了哪些查询?

我也尝试过from django.db import connection,如here 所述,但得到了这样的空数组:

>>> from django.db import connection
>>> connection.queries
[]

请帮我实现我想要的。

【问题讨论】:

  • 如果你在一个单独的shell中运行它,那么它当然不会包含另一个正在运行的程序的查询。答案涉及您在 shell 本身中执行的查询。
  • 哦,我明白了。那我该怎么做呢?如果在任何文件中,那么如何?你能帮忙吗?谢谢。

标签: python django django-rest-framework django-views django-orm


【解决方案1】:

如果你在单独的 shell 中运行它,那么它当然不会包含 另一个 正在运行的程序的查询。答案涉及您在 shell 本身中执行的查询。

例如,如果你会使用:

>>> print(Course.objects.all())
>>> from django.db import connection
>>> connection.queries

它会显示一个查询,因为您在 that shell 中强制评估 QuerySet

您可以使用django-sqlprint-middleware 之类的包来打印查询。所以你安装它,例如在本地环境中:

pip install <b>django-sqlprint-middleware</b>

然后在settings.pyMIDDLEWARE设置中添加这块中间件:

# settings.py

MIDDLEWARE = (
    # …,
    'django_sqlprint_middleware.SqlPrintMiddleware',
    # …,
)

这将DEBUGTESTING 设置为True 时打印查询。但是,我建议不要在生产中使用它。

【讨论】:

    【解决方案2】:

    像这样运行你的 Django 应用:

    ./manage.py shell_plus --print-sql
    

    你想看到在这个 shell 中打印的查询

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 2018-05-21
      • 1970-01-01
      • 2012-10-21
      • 2018-11-16
      • 2017-01-18
      • 2020-12-03
      • 1970-01-01
      相关资源
      最近更新 更多