Opened 8 years ago
Last modified 8 years ago
#28035 new New feature
Help Django Programmer to link a Query in their database logs with the Python line of codes that generated the request. — at Initial Version
Reported by: | Rémy Hubscher | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.10 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
The QuerySet creation and the QuerySet execution doesn't happens at the same time in Django.
However when you want to link a query in your database logs with your Python code, you want to see where the QuerySet have been created as well as were it was executed.
Each time you call a new method on your queryset it will create a new queryset with the new filter or order_by or annotate calls.
The plan would be to keep track of all these calls that generated a new QuerySet and to add it as a database comment when executing the request.
Then you would be able to link easily where your request have been generated from in your python code.
SELECT * FROM users WHERE id = 1; -- users/views.py L.21
user = Users.objects.get(pk=request.user.id)
It is especially useful when you create conditionals QuerySet:
SELECT * FROM users WHERE name LIKE 'enac%' ORDER BY username; -- users/views.py L.18
qs = Users.objects.all() \n users/views.py L.25
qs = qs.filter(namestartswith="enac")\n users/views.py L.30
qs = qs.order_by('username')\n templates/user_search.html L.55
{% for user in users %}`
If we want to do that as a library outside of Django, it means we would have to monkey patch the QuerySet object.
Do we want to make it a Django Feature?
We could add the comment only when DEBUG = True
or DATABASE_QUERY_LOGS = True