瀏覽代碼

Fixed #22576: Ensure makemigrations doesn't touch the database.

Andrew Godwin 11 年之前
父節點
當前提交
f9d7e18dc5
共有 2 個文件被更改,包括 8 次插入6 次删除
  1. 3 4
      django/core/management/commands/makemigrations.py
  2. 5 2
      django/db/migrations/loader.py

+ 3 - 4
django/core/management/commands/makemigrations.py

@@ -50,10 +50,9 @@ class Command(BaseCommand):
                 self.stderr.write("App '%s' could not be found. Is it in INSTALLED_APPS?" % app_label)
             sys.exit(2)
 
-        # Load the current graph state. Takes a connection, but it's not used
-        # (makemigrations doesn't look at the database state).
-        # Also make sure the graph is built without unmigrated apps shoehorned in.
-        loader = MigrationLoader(connections[DEFAULT_DB_ALIAS])
+        # Load the current graph state. Pass in None for the connection so
+        # the loader doesn't try to resolve replaced migrations from DB.
+        loader = MigrationLoader(None)
 
         # Before anything else, see if there's conflicting apps and drop out
         # hard if there are any and they don't want to merge

+ 5 - 2
django/db/migrations/loader.py

@@ -143,8 +143,11 @@ class MigrationLoader(object):
         # Load disk data
         self.load_disk()
         # Load database data
-        recorder = MigrationRecorder(self.connection)
-        self.applied_migrations = recorder.applied_migrations()
+        if self.connection is None:
+            self.applied_migrations = set()
+        else:
+            recorder = MigrationRecorder(self.connection)
+            self.applied_migrations = recorder.applied_migrations()
         # Do a first pass to separate out replacing and non-replacing migrations
         normal = {}
         replacing = {}