#28035: Help Django Programmer to link a Query in their database logs with the
Python lines of code that generated the request.
-------------------------------------+-------------------------------------
     Reporter:  Rémy Hubscher        |                    Owner:  nobody
         Type:  New feature          |                   Status:  new
    Component:  Database layer       |                  Version:  1.10
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Tim Graham):

 * type:  Uncategorized => New feature
 * component:  Uncategorized => Database layer (models, ORM)


Old 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(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`

New 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(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`

--

Comment:

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

--
Ticket URL: <https://code.djangoproject.com/ticket/28035#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/063.18e96eb9fb446fdc31a53475fc2f2854%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to