Web系统可以采用自底向上的顺序,从数据存储一直到数据展现,按照这个顺序一点一点查找性能问题。
运行Django看到原始SQL查询确保Django DEBUG设置为True。然后,就这样做:
connection.queries
connection.queries查询包括所有SQL语句——插入、更新、选择等。每次应用程序访问数据库时,查询都会被记录下来。
如果您使用多个数据库,您可以在connections字典的每个成员上使用相同的接口:
reset_queries()
但是使用起来好像不是很方便。
django-exensions显示原始SQL在shell命令行的环境下,可以使用 django-exensions的 shell_plus 命令并打开--print-sql 选项。
调试配置面板django-debug-toolbar还有个更方便的方式, 使用 django-debug-toolbar 工具,就可以在web端查看SQL查询的详细统计结果,其实它功能远不止这个。
总结下3个方式
- 数据库 (缺少索引/数据模型)
- 数据存储接口 (ORM/低效的查询)
- 展现/数据使用 (Views/报表等)
运行Django看到原始SQL查询确保Django DEBUG设置为True。然后,就这样做:
[Python]
纯文本查看
复制代码
1 2 3 4 5 6 7 | >>> from django.db import connection>>> connection.queries[]>>> Author.objects.all()<QuerySet [<Author: Author object>]>>>> connection.queries[{u'time': u'0.002', u'sql': u'SELECT "library_author"."id", "library_author"."name" FROM "library_author" LIMIT 21'}] |
connection.queries
只有在调试为真时。它是一个按查询执行顺序排列的字典列表。每个词典都有以下内容:
[Python]
纯文本查看
复制代码
1 2 | ``sql`` -- The raw SQL statement``time`` -- How long the statement took to execute, in seconds. |
connection.queries查询包括所有SQL语句——插入、更新、选择等。每次应用程序访问数据库时,查询都会被记录下来。
如果您使用多个数据库,您可以在connections字典的每个成员上使用相同的接口:
[Python]
纯文本查看
复制代码
1 2 | >>> from django.db import connections>>> connections['my_db_alias'].queries |
如果需要在函数的任意位置手动清除查询列表,只需调用
,如下所示:
[Python]
纯文本查看
复制代码
1 2 | from django.db import reset_queriesreset_queries() |
但是使用起来好像不是很方便。
django-exensions显示原始SQL在shell命令行的环境下,可以使用 django-exensions的 shell_plus 命令并打开--print-sql 选项。
[Python]
纯文本查看
复制代码
1 | python manage.py shell_plus --print-sql |
运行该shell后可以在命令行输入查询语句,会自动打印SQL内容。
[Python]
纯文本查看
复制代码
1 2 3 4 | >>> Author.objects.all()SELECT "library_author"."id", "library_author"."name" FROM "library_author" LIMIT 21Execution time: 0.001393s [Database: default]<QuerySet [<Author: Author object>]> |
调试配置面板django-debug-toolbar还有个更方便的方式, 使用 django-debug-toolbar 工具,就可以在web端查看SQL查询的详细统计结果,其实它功能远不止这个。
总结下3个方式
- django.db.connection django自身提供,比较底层
- django-extensions 可以在shell环境下方面调试
- django-debug-toolbar 可以在web端直接看到debug结果