#32788: Transaction APIs do not consult the DB router to choose DB connection
-------------------------------------+-------------------------------------
               Reporter:  Aditya N   |          Owner:  nobody
                   Type:             |         Status:  new
  Uncategorized                      |
              Component:  Database   |        Version:  3.2
  layer (models, ORM)                |       Keywords:  transaction API
               Severity:  Normal     |  atomic DB router
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 From the Django docs, for any ORM query made, the DB alias to use is
 determined by the following rules:

 - Checks if the `using` keyword is used either as a parameter in the
 function call or chained with `QuerySet`.
 - Consults the DB routers in order until a match is found.
 - Falls back to the default router which always returns `default` as the
 alias.

 Using the router scheme works perfectly for ORM queries. However, when it
 comes to using transaction APIs ​(like the transaction.atomic construct),
 it becomes mandatory to specify the `using` kwarg explicitly in all of its
 publicly exposed APIs if a DB other than the `default` alias has to be
 chosen.

 To illustrate why this is a problem, consider the following scenario:
 - A DB router exists such that it directs queries to a specific database
 based on a value set in ''thread-local'' storage by a middleware.
 - When ORM queries from within the view are fired, they automatically get
 forwarded to the right DB **without explicitly citing** the `using`
 keyword owing to  the router.
 - But if the transaction.atomic construct is used, the `using` keyword
 would have to be explicitly specified each time. While this might seem
 fine, it creates the following problems:
   i. For large code bases, it becomes highly unwieldy to make sure that
 the `using` keyword has been mentioned in every transaction API call.
 Also, if one tries to implement the above scheme in an already existing
 code base, it would be impractical to add the `using` keyword in all lines
 calling the transaction APIs.
   ii. It doesn't gel well with the the routers framework.

 A proposed work around could to be to add a separate method named
 `db_for_transaction` to the routers framework which would be consulted by
 the transaction APIs first, before falling back to using the `default` DB
 alias.

 If we can finalise on this, I could submit a PR for the same.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32788>
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/054.7703db87d8edab4e1cb1f99c5e915b2b%40djangoproject.com.

Reply via email to