如何查看 Django ORM 运行的查询?

Posted

技术标签:

【中文标题】如何查看 Django ORM 运行的查询?【英文标题】:How to see queries run by 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 本身中执行的查询。 哦,我明白了。那我该怎么做呢?如果在任何文件中,那么如何?你能帮忙吗?谢谢。 【参考方案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 中打印的查询

【讨论】:

以上是关于如何查看 Django ORM 运行的查询?的主要内容,如果未能解决你的问题,请参考以下文章

[Django] 查看orm自己主动运行的原始查询sql

如何查看Django ORM执行的SQL语句

如何使用Django ORM查询计算数量乘以价格

Django的ORM基础增删改查

django的 ORM 操作 增加和查询

django之路由分组,路由分发,FBV,CBV,ORM框架