Opened 8 years ago
Last modified 8 years ago
#28035 new New feature
Allowing logging the queryset location for a given query
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 (last modified by )
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(name__startswith="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
Change History (4)
comment:1 by , 8 years ago
Summary: | Help Django Programmer to link a Query in their database logs with the Python line of codes that generated the request. → Help Django Programmer to link a Query in their database logs with the Python lines of code that generated the request. |
---|
comment:2 by , 8 years ago
Component: | Uncategorized → Database layer (models, ORM) |
---|---|
Description: | modified (diff) |
Type: | Uncategorized → New feature |
comment:3 by , 8 years ago
The idea I had in mind was to add an new property to the queryset if the DEBUG setting is set to True that contains a traceback to the current QuerySet creation.
The new queryset is created with the traceback list of the previous queryset in which we append the new traceback from the current creation.
It is then possible to look at the queryset property when we actually build the request from it to have a full traceback to each call that was used to create the queryset.
comment:4 by , 8 years ago
Summary: | Help Django Programmer to link a Query in their database logs with the Python lines of code that generated the request. → Allowing logging the queryset location for a given query |
---|---|
Triage Stage: | Unreviewed → Accepted |
Tentatively accepting. I guess we'll have to see the implementation to see if it looks okay and works well enough.
I'm not sure if this is feasible to implement. How would it work?