如何查看 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.py
的MIDDLEWARE
设置中添加这块中间件:
# settings.py
MIDDLEWARE = (
# …,
'django_sqlprint_middleware.SqlPrintMiddleware',
# …,
)
这将仅在DEBUG
或TESTING
设置为True
时打印查询。但是,我建议不要在生产中使用它。
【讨论】:
【参考方案2】:像这样运行你的 Django 应用:
./manage.py shell_plus --print-sql
你想看到在这个 shell 中打印的查询
【讨论】:
以上是关于如何查看 Django ORM 运行的查询?的主要内容,如果未能解决你的问题,请参考以下文章