diff options
| author | Chris Beaven <smileychris@gmail.com> | 2014-06-23 13:29:27 +1200 |
|---|---|---|
| committer | Chris Beaven <smileychris@gmail.com> | 2014-06-23 13:36:22 +1200 |
| commit | 21c496ea52b8bdf0d97507c00a87286425dac087 (patch) | |
| tree | 34b67646fd791a23d3833108cf64ef724f10e5c5 | |
| parent | ecc06d44ed67c5bd27278244e5cf315d6fa2c893 (diff) | |
Fixed #22881 -- Better soft_applied migration detection
| -rw-r--r-- | django/db/migrations/executor.py | 8 | ||||
| -rw-r--r-- | tests/migrations/test_executor.py | 14 | ||||
| -rw-r--r-- | tests/migrations/test_migrations/0001_initial.py | 7 |
3 files changed, 25 insertions, 4 deletions
diff --git a/django/db/migrations/executor.py b/django/db/migrations/executor.py index 04d2b778f5..ecd9d0fdf2 100644 --- a/django/db/migrations/executor.py +++ b/django/db/migrations/executor.py @@ -132,11 +132,13 @@ class MigrationExecutor(object): """ project_state = self.loader.project_state((migration.app_label, migration.name), at_end=True) apps = project_state.render() + found_create_migration = False for operation in migration.operations: if isinstance(operation, migrations.CreateModel): model = apps.get_model(migration.app_label, operation.name) if model._meta.db_table not in self.connection.introspection.get_table_list(self.connection.cursor()): return False - else: - return False - return True + found_create_migration = True + # If we get this far and we found at least one CreateModel migration, + # the migration is considered implicitly applied. + return found_create_migration diff --git a/tests/migrations/test_executor.py b/tests/migrations/test_executor.py index b6909a15a1..e933f9d8bd 100644 --- a/tests/migrations/test_executor.py +++ b/tests/migrations/test_executor.py @@ -155,6 +155,12 @@ class ExecutorTests(MigrationTestBase): self.assertTableNotExists("migrations_author") self.assertTableNotExists("migrations_tribble") # Run it normally + self.assertEqual( + executor.migration_plan([("migrations", "0001_initial")]), + [ + (executor.loader.graph.nodes["migrations", "0001_initial"], False), + ], + ) executor.migrate([("migrations", "0001_initial")]) # Are the tables there now? self.assertTableExists("migrations_author") @@ -171,9 +177,17 @@ class ExecutorTests(MigrationTestBase): # Make sure that was faked self.assertEqual(state["faked"], True) # Finally, migrate forwards; this should fake-apply our initial migration + executor.loader.build_graph() + self.assertEqual( + executor.migration_plan([("migrations", "0001_initial")]), + [ + (executor.loader.graph.nodes["migrations", "0001_initial"], False), + ], + ) executor.migrate([("migrations", "0001_initial")]) self.assertEqual(state["faked"], True) # And migrate back to clean up the database + executor.loader.build_graph() executor.migrate([("migrations", None)]) self.assertTableNotExists("migrations_author") self.assertTableNotExists("migrations_tribble") diff --git a/tests/migrations/test_migrations/0001_initial.py b/tests/migrations/test_migrations/0001_initial.py index 581d536814..9286d0f02b 100644 --- a/tests/migrations/test_migrations/0001_initial.py +++ b/tests/migrations/test_migrations/0001_initial.py @@ -25,6 +25,11 @@ class Migration(migrations.Migration): ("id", models.AutoField(primary_key=True)), ("fluffy", models.BooleanField(default=True)), ], - ) + ), + + migrations.AlterUniqueTogether( + name='author', + unique_together=set([('name', 'slug')]), + ), ] |
