#29149: django-admin migrate fails on 2.0 when a project contains squashed migrations from an earlier version --------------------------------------+------------------------ Reporter: dcollinsn | Owner: nobody Type: Bug | Status: new Component: Migrations | Version: 2.0 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 | --------------------------------------+------------------------ Hello,
Upgrading a project from 1.X to 2.0. One of my apps contains the following migrations: {{{ dcollins@digitalis:~/judgeappstest$ ls exams/migrations/ | grep -v .pyc 0001_squashed_0002_auto_20170519_2125.py 0002_examname.py 0003_exam_editors.py 0004_exam_question_log.py 0005_exam_admin.py 0006_examquestion_topics.py 0007_examtoquestion_option_order.py 0008_exam_for_other_user.py 0009_printed_exams.py 0010_exam_cooldown.py 0011_exam_accepts_suggestions.py 0012_exam_translations.py 0013_examtype_sortkey.py 0014_create_for_others_gk.py 0015_translated_question_reviewed.py 0016_translate_cards.py 0017_card_empty_oracle.py }}} The first such migration was squashed multiple times (0001 through 000X were squashed, and then that migration was squashed into what we have now). Samples from that migration file: {{{ class Migration(migrations.Migration): replaces = [(b'exams', '0001_squashed_0002_auto_20170518_1851'), (b'exams', '0002_auto_20170519_2125')] }}} {{{ migrations.CreateModel( name='ExamQuestion', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('author', models.ForeignKey(on_delete=models.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), }}} After upgrading to Python 3.6/Django 2.0, when attempting to run `migrate`, I get the following errors: {{{ root@ubuntu-xenial:/dcif# python3 manage.py migrate gatekeeper System check identified some issues: WARNINGS: accounts.DCIProfile.roles: (fields.W340) null has no effect on ManyToManyField. Operations to perform: Apply all migrations: gatekeeper Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/usr/local/lib/python3.6/site- packages/django/core/management/__init__.py", line 371, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.6/site- packages/django/core/management/__init__.py", line 365, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.6/site- packages/django/core/management/base.py", line 288, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python3.6/site- packages/django/core/management/base.py", line 335, in execute output = self.handle(*args, **options) File "/usr/local/lib/python3.6/site- packages/django/core/management/commands/migrate.py", line 159, in handle pre_migrate_state = executor._create_project_state(with_applied_migrations=True) File "/usr/local/lib/python3.6/site- packages/django/db/migrations/executor.py", line 79, in _create_project_state migration.mutate_state(state, preserve=False) File "/usr/local/lib/python3.6/site- packages/django/db/migrations/migration.py", line 85, in mutate_state operation.state_forwards(self.app_label, new_state) File "/usr/local/lib/python3.6/site- packages/django/db/migrations/operations/fields.py", line 70, in state_forwards state.models[app_label, self.model_name_lower].fields.append((self.name, field)) KeyError: ('exams', 'examquestion') }}} That led me to [https://stackoverflow.com/questions/34883026/django- migrations-error-keyerror-list-uuser a Stack Overflow answer], and especially kagronick's answer: {{{ I found what causes this and the solution for it. If you have a squashed migration that has a "replaces" property, remove the tuples that reference migrations that don't appear in your django_migrations table. This fixes it. }}} So, I made one change to the migration file: {{{ diff --git a/exams/migrations/0001_squashed_0002_auto_20170519_2125.py b/exams/migrations/0001_squashed_0002_auto_20170519_2125.py index 0dd64a8a..1eac171d 100644 --- a/exams/migrations/0001_squashed_0002_auto_20170519_2125.py +++ b/exams/migrations/0001_squashed_0002_auto_20170519_2125.py @@ -7,7 +7,7 @@ from django.conf import settings class Migration(migrations.Migration): - replaces = [(b'exams', '0001_squashed_0002_auto_20170518_1851'), (b'exams', '0002_auto_20170519_2125')] + replaces = [] }}} And now the migration is successful: {{{ root@ubuntu-xenial:/dcif# python3 manage.py migrate gatekeeper System check identified some issues: WARNINGS: accounts.DCIProfile.roles: (fields.W340) null has no effect on ManyToManyField. Operations to perform: Apply all migrations: gatekeeper Running migrations: Applying gatekeeper.0007_roleconstraint_invert... OK }}} I don't know exactly what the cause is here, but I feel like at minimum this shouldn't fail quite so spectacularly. If the issue is really as simple as Django failing to parse a migration file that "replaces" another migration file, which has since been removed from the repository, I would think that would be a bug. -- Ticket URL: <https://code.djangoproject.com/ticket/29149> 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/052.8968b747c2aed442857f69045777de87%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.