#24900: KeyError when trying to migrate to a replaced migration
--------------------------------------+------------------------
               Reporter:  carljm      |          Owner:  nobody
                   Type:  Bug         |         Status:  new
              Component:  Migrations  |        Version:  1.8
               Severity:  Normal      |       Keywords:
           Triage Stage:  Unreviewed  |      Has patch:  0
    Needs documentation:  0           |    Needs tests:  0
Patch needs improvement:  0           |  Easy pickings:  0
                  UI/UX:  0           |
--------------------------------------+------------------------
 Django exhibits some internal confusion regarding whether replaced
 migrations exist or not. Consider this simple app with two migrations and
 squashed migration replacing both:

 {{{
 $ ls testproj/migrations/
 0001_initial.py  0001_squashed_0002_thing_age.py  0002_thing_age.py
 __init__.py
 }}}

 When it comes to disambiguating input, Django seems to believe that the
 replaced migrations still need to be considered:

 {{{
 $ ./manage.py migrate testproj 0001
 CommandError: More than one migration matches '0001' in app 'testproj'.
 Please be more specific.
 }}}

 But if you actually try to disambiguate and specify one of the replaced
 migrations, Django no longer thinks it exists (and isn't very graceful
 about telling you so):

 {{{
 $ ./manage.py migrate testproj 0001_initial
 Traceback (most recent call last):
   File "./manage.py", line 10, in <module>
     execute_from_command_line(sys.argv)
   File
 
"/home/carljm/projects/django/django/django/django/core/management/__init__.py",
 line 330, in execute_from_command_line
     utility.execute()
   File
 
"/home/carljm/projects/django/django/django/django/core/management/__init__.py",
 line 322, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File
 "/home/carljm/projects/django/django/django/django/core/management/base.py",
 line 347, in run_from_argv
     self.execute(*args, **cmd_options)
   File
 "/home/carljm/projects/django/django/django/django/core/management/base.py",
 line 398, in execute
     output = self.handle(*args, **options)
   File
 
"/home/carljm/projects/django/django/django/django/core/management/commands/migrate.py",
 line 135, in handle
     plan = executor.migration_plan(targets)
   File
 "/home/carljm/projects/django/django/django/django/db/migrations/executor.py",
 line 50, in migration_plan
     self.loader.graph.node_map[target].children
 KeyError: ('testproj', '0001_initial')
 }}}

 There could be several different approaches to fixing this, but my feeling
 is that Django shouldn't prevent you from migrating to a replaced
 migration. If a migration still exists on disk, even if it's been squashed
 and you've fully migrated the squashed set, you should be able to migrate
 back to a state within the squashed set. It seems like there might be
 production rollback cases where that could be important, and I don't see
 in principle why it shouldn't be possible.

 If that turns out to be impractical, then I think Django oughtn't bother
 you about resolving ambiguities with migration names it won't let you
 migrate to anyway. And the "nonexistent" error for this case should be
 nicer than a raw `KeyError`. (In Django 1.7 the error was "ValueError:
 Node ('testproj17', '0001_initial') not a valid node", which is perhaps a
 bit better, but not much.)

--
Ticket URL: <https://code.djangoproject.com/ticket/24900>
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 post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/049.ba8a4a07c30e085d118285e87f18273c%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to