#24026: migration RunPython operation ignores db router allow_migrate
----------------------------+-----------------------
     Reporter:  dikamilo    |      Owner:  nobody
         Type:  Bug         |     Status:  new
    Component:  Migrations  |    Version:  1.7
     Severity:  Normal      |   Keywords:  migration
 Triage Stage:  Unreviewed  |  Has patch:  0
Easy pickings:  0           |      UI/UX:  0
----------------------------+-----------------------
 I wrote custom router for SaaS architecture to handle different databases
 and custom management command to apply migrations for all databases. I'm
 sure that this router and command works properly.

 All migrations works fine except migrations with {{{RunPython}}} command
 in operations - that migrations are executed ignoring {{{allow_migrate}}}
 policy in database router.

 For example in one of my app i have several migrations generated by django
 (manage.py makemigrations). My router checks if given app models should be
 in given database and if it return False, django not create table, not
 change schema etc. All works just fine and model is not in database. But
 if I create empty migration and add RunPython operation that add initial
 data to database for given model, django execute this migration throwing
 out error {{{django.db.utils.OperationalError: no such table}}}.

 I checked django code and for example in {{{AlterModelTable}}} operation
 {{{database_forwards}}} method uses {{{self.allowed_to_migrate}}}:

 {{{
 def database_forwards(self, app_label, schema_editor, from_state,
 to_state):
         old_apps = from_state.render()
         new_apps = to_state.render()
         old_model = old_apps.get_model(app_label, self.name)
         new_model = new_apps.get_model(app_label, self.name)
         if self.allowed_to_migrate(schema_editor.connection.alias,
 new_model):
             schema_editor.alter_db_table(
                 new_model,
                 old_model._meta.db_table,
                 new_model._meta.db_table,
             )
 }}}
 To compare RunPython {{{database_forwards}}} method look like this (cut
 comments):

 {{{
 def database_forwards(self, app_label, schema_editor, from_state,
 to_state):
         self.code(from_state.render(), schema_editor)
 }}}

 I think it's a bug and {{{RunPython}}} command should use
 {{{self.allowed_to_migrate}}} too.

--
Ticket URL: <https://code.djangoproject.com/ticket/24026>
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/051.34205d3d6489ca71b8a524c702c38343%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to