捕获Django和SQLAlchemy执行的查询的工具
项目描述
snapshot-queries
捕获通过Django和SqlAlchemy ORM查询执行的SQL语句
使用场景
- 查看由复杂的Django Queryset或SQLAlchemy查询执行的精确查询
- 快速查看代码块中执行的慢查询
- 识别代码块中执行的类似查询,以帮助检测N+1查询问题
- 查看触发查询执行的精确代码行,包括其完整的堆栈跟踪
示例
显示代码块中执行的查询
from django.contrib.auth import get_user_model
from snapshot_queries import snapshot_queries
User = get_user_model()
with snapshot_queries() as queries_executed:
User.objects.only('email').get(id=1)
User.objects.only('email').get(id=7)
queries_executed.display()
输出
Query 1
---------
2 ms
/path/to/module.py:5 in function_name
User.objects.only('email').get(id=1)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Query 2
---------
< 1 ms
/path/to/module.py:6 in function_name
User.objects.only('email').get(id=7)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 7
显示每个查询的特定属性
您可以选择显示哪些属性。
支持的显示属性
- code (触发查询的Python代码)
- duration (查询执行所需的时间)
- idx (执行查询的索引)
- location (查询执行的代码位置)
- stacktrace (每个查询的完整堆栈跟踪)
- sql (查询的SQL语句)
- colored (显示着色的SQL语句)
- formatted (显示格式化的SQL语句)
例如,要显示每个查询的堆栈跟踪,请使用 queries_executed.display(stacktrace=True)
from django.contrib.auth import get_user_model
from snapshot_queries import snapshot_queries
User = get_user_model()
def main():
with snapshot_queries() as queries_executed:
User.objects.only('email').get(id=1)
User.objects.only('is_staff').get(id=7)
queries_executed.display(sql=True, stacktrace=True)
main()
输出
Query 1
---------
./path/to/file.py:12 in <module>
main()
./path/to/file.py:8 in main
User.objects.only('email').get(id=1)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Query 2
---------
./path/to/file.py:13 in <module>
main()
./path/to/file.py:9 in main
User.objects.only('is_staff').get(id=7)
SELECT "auth_user"."id",
"auth_user"."is_staff"
FROM "auth_user"
WHERE "auth_user"."id" = 7
按持续时间排序查询
fastest_queries = queries_executed.order_by('duration')[:3]
slowest_queries = queries_executed.order_by('-duration')[:3]
slowest_queries_executed.display()
检查最慢的查询
slowest_query = queries_executed.order_by('-duration')[0]
slowest_query.display(code=True, location=True, sql=True)
将具有重复SQL语句的查询分组在一起
from django.contrib.auth import get_user_model
from snapshot_queries import snapshot_queries
User = get_user_model()
with snapshot_queries() as queries_executed:
User.objects.only('email').get(id=1)
User.objects.only('email').get(id=1)
User.objects.only('email').get(id=1)
User.objects.only('email').get(id=7)
duplicates = queries_executed.duplicates().display()
输出
========================
3 duplicate queries
========================
Query 1
---------
1 ms
./path/to/file.py:9 in main
User.objects.only('email').get(id=1)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Query 2
---------
< 1 ms
./path/to/file.py:10 in main
User.objects.only('email').get(id=1)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Query 3
---------
< 1 ms
./path/to/file.py:11 in main
User.objects.only('email').get(id=1)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 1
将具有类似SQL语句的查询分组在一起
from django.contrib.auth import get_user_model
from snapshot_queries import snapshot_queries
User = get_user_model()
with snapshot_queries() as queries_executed:
User.objects.only('email').get(id=1)
User.objects.only('email').get(id=1)
User.objects.only('email').get(id=1)
User.objects.only('email').get(id=7)
similar = queries_executed.similar().display()
输出
========================
4 similar queries
========================
Query 1
---------
2 ms
/path/to/file.py:6 in main
User.objects.only('email').get(id=1)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Query 2
---------
< 1 ms
/path/to/file.py:7 in main
User.objects.only('email').get(id=1)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Query 3
---------
< 1 ms
/path/to/file.py:8 in main
User.objects.only('email').get(id=1)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Query 4
---------
< 1 ms
/path/to/file.py:9 in main
User.objects.only('email').get(id=7)
SELECT "auth_user"."id",
"auth_user"."email"
FROM "auth_user"
WHERE "auth_user"."id" = 7
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
snapshot-queries-0.5.3.tar.gz (13.8 kB 查看散列值)
构建分发
snapshot_queries-0.5.3-py3-none-any.whl (16.9 kB 查看散列值)
关闭
snapshot-queries-0.5.3.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 949ab3ad35f3a0376c443a34170278e1ac929c00de6bab0a5b037dfd1b2b374b |
|
MD5 | ae39ff701f85d656d70c6a6ca3c101bf |
|
BLAKE2b-256 | c0fc269ea6a7b128f8f5ec2b0fdf9987fd99f686a24957640f2208504510bd05 |
关闭
snapshot_queries-0.5.3-py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 19c7c00fb290d894a367968031d902ddc99ae9f2d127a4b62624c93f2f1157af |
|
MD5 | 68e04e74949be281760dae0794ca177c |
|
BLAKE2b-256 | 27fdc7bc41acbaa7ebd37401ed87bc73278678624bd2b2efb778643603babfb3 |