mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.7.x] Revert "Fixed #23474 -- Prevented migrating backwards from unapplying the wrong migrations."
Backport of d7ab2cefb7 from master
			
			
This commit is contained in:
		| @@ -36,15 +36,11 @@ class MigrationExecutor(object): | ||||
|             # If the migration is already applied, do backwards mode, | ||||
|             # otherwise do forwards mode. | ||||
|             elif target in applied: | ||||
|                 app_label = target[0] | ||||
|                 next_migration_prefix = str(int(target[1][:4]) + 1) | ||||
|                 try: | ||||
|                     next_migration = self.loader.get_migration_by_prefix(app_label, next_migration_prefix) | ||||
|                 except KeyError: | ||||
|                     # If `target` is the most recent one in its app, there is nothing to do. | ||||
|                     pass | ||||
|                 else: | ||||
|                     backwards_plan = self.loader.graph.backwards_plan(next_migration) | ||||
|                 backwards_plan = self.loader.graph.backwards_plan(target)[:-1] | ||||
|                 # We only do this if the migration is not the most recent one | ||||
|                 # in its app - that is, another migration with the same app | ||||
|                 # label is in the backwards plan | ||||
|                 if any(node[0] == target[0] for node in backwards_plan): | ||||
|                     for migration in backwards_plan: | ||||
|                         if migration in applied: | ||||
|                             plan.append((self.loader.graph.nodes[migration], True)) | ||||
|   | ||||
| @@ -47,9 +47,6 @@ Bugfixes | ||||
| * Allowed migrations to work with ``app_label``\s that have the same last | ||||
|   part (e.g. ``django.contrib.auth`` and ``vendor.auth``) (:ticket:`23483`). | ||||
|  | ||||
| * Fixed bug in migrations that could cause unexpected data loss when executing | ||||
|   a backwards or no-op migration (:ticket:`23474`). | ||||
|  | ||||
| * Restored the ability to deepcopy ``F`` objects (:ticket:`23492`). | ||||
|  | ||||
| * Formats for Welsh (``cy``) and several Chinese locales (``zh_CN``, | ||||
|   | ||||
| @@ -231,41 +231,3 @@ class ExecutorTests(MigrationTestBase): | ||||
|         executor.migrate([("migrations", None)]) | ||||
|         self.assertTableNotExists("migrations_author") | ||||
|         self.assertTableNotExists("migrations_tribble") | ||||
|  | ||||
|     @override_settings( | ||||
|         MIGRATION_MODULES={ | ||||
|             "migrations": "migrations.test_migrations_backwards_deps_1", | ||||
|             "migrations2": "migrations2.test_migrations_backwards_deps_2", | ||||
|         }, | ||||
|     ) | ||||
|     def test_backwards_deps(self): | ||||
|         """ | ||||
|         #23474 - Migrating backwards shouldn't cause the wrong migrations to be | ||||
|         unapplied. | ||||
|  | ||||
|         Migration dependencies (x -> y === y depends on x): | ||||
|         m.0001 -+-> m.0002 | ||||
|                 +-> m2.0001 | ||||
|  | ||||
|         1) Migrate m2 to 0001, causing { m.0001, m2.0002 } to be applied. | ||||
|         2) Migrate m to 0001. m.0001 has already been applied, so this should | ||||
|            be a noop. | ||||
|         """ | ||||
|         executor = MigrationExecutor(connection) | ||||
|         executor.migrate([("migrations2", "0001_initial")]) | ||||
|         try: | ||||
|             self.assertTableExists("migrations2_example") | ||||
|             # Rebuild the graph to reflect the new DB state | ||||
|             executor.loader.build_graph() | ||||
|             self.assertEqual( | ||||
|                 executor.migration_plan([("migrations", "0001_initial")]), | ||||
|                 [], | ||||
|             ) | ||||
|             executor.migrate([("migrations", "0001_initial")]) | ||||
|             self.assertTableExists("migrations2_example") | ||||
|         finally: | ||||
|             # And migrate back to clean up the database | ||||
|             executor.loader.build_graph() | ||||
|             executor.migrate([("migrations", None)]) | ||||
|             self.assertTableNotExists("migrations_author") | ||||
|             self.assertTableNotExists("migrations_tribble") | ||||
|   | ||||
| @@ -1,16 +0,0 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| from __future__ import unicode_literals | ||||
|  | ||||
| from django.db import migrations, models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     dependencies = [('migrations', '0001_initial')] | ||||
|     operations = [ | ||||
|         migrations.CreateModel( | ||||
|             "Example", | ||||
|             [ | ||||
|                 ("id", models.AutoField(primary_key=True)), | ||||
|             ], | ||||
|         ), | ||||
|     ] | ||||
		Reference in New Issue
	
	Block a user