Opened 7 years ago

Last modified 7 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 Tim Graham)

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 Rémy Hubscher, 7 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 Tim Graham, 7 years ago

Component: UncategorizedDatabase layer (models, ORM)
Description: modified (diff)
Type: UncategorizedNew feature

I'm not sure if this is feasible to implement. How would it work?

comment:3 by Rémy Hubscher, 7 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 Tim Graham, 7 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: UnreviewedAccepted

Tentatively accepting. I guess we'll have to see the implementation to see if it looks okay and works well enough.

Note: See TracTickets for help on using tickets.
Back to Top