A tool for capturing queries executed in Django and SQLAlchemy
Project description
snapshot-queries
Capture all SQL statements executed via Django and SqlAlchemy ORM queries
Use cases
- See the exact query executed by a complex Django Queryset or SQLAlchemy query
- Quickly see the slowest queries executed in a code block
- Identify similar queries executed in a code block to help detect the N+1 query problem
- See the exact line of code that triggered a query execution, including its full stacktrace
Examples
- Display queries executed in a code block
- Display specific attributes of each query
- Order queries by duration
- Inspect the slowest query
- Group queries with duplicate sql statements together
- Group queries with similar sql statements together
Display queries executed in a code block
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()
Output:
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
Display specific attributes of each query
You can choose which attributes to display.
Supported attributes to display:
- code (the python code that triggered the query)
- duration (how long the query took to execute)
- idx (the index of the query executed)
- location (the location in our code where the query was executed)
- stacktrace (the full stacktrace for each query)
- sql (the sql statement of the query)
- colored (display the sql statement colored)
- formatted (display the sql statement formatted)
E.g. to display the stacktrace for each query, use 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()
Output:
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
Order queries by duration
fastest_queries = queries_executed.order_by('duration')[:3]
slowest_queries = queries_executed.order_by('-duration')[:3]
slowest_queries_executed.display()
Inspect the slowest query
slowest_query = queries_executed.order_by('-duration')[0]
slowest_query.display(code=True, location=True, sql=True)
Group queries with duplicate sql statements together
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()
Output:
========================
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
Group queries with similar sql statements together
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()
Output
========================
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
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file snapshot-queries-0.5.3.tar.gz.
File metadata
- Download URL: snapshot-queries-0.5.3.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/35.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.64.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
949ab3ad35f3a0376c443a34170278e1ac929c00de6bab0a5b037dfd1b2b374b
|
|
| MD5 |
ae39ff701f85d656d70c6a6ca3c101bf
|
|
| BLAKE2b-256 |
c0fc269ea6a7b128f8f5ec2b0fdf9987fd99f686a24957640f2208504510bd05
|
File details
Details for the file snapshot_queries-0.5.3-py3-none-any.whl.
File metadata
- Download URL: snapshot_queries-0.5.3-py3-none-any.whl
- Upload date:
- Size: 16.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/35.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.64.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
19c7c00fb290d894a367968031d902ddc99ae9f2d127a4b62624c93f2f1157af
|
|
| MD5 |
68e04e74949be281760dae0794ca177c
|
|
| BLAKE2b-256 |
27fdc7bc41acbaa7ebd37401ed87bc73278678624bd2b2efb778643603babfb3
|