Fixed #26930 -- Prevented makemigrations from accessing an empty database.

Thanks Liz Lemon for the report and investigation and
Claude Paroz for the test.
This commit is contained in:
Tim Graham 2016-08-01 07:57:12 -04:00 committed by GitHub
parent f530b4fdfc
commit aad46c3e37
2 changed files with 19 additions and 2 deletions

View File

@ -95,7 +95,9 @@ class Command(BaseCommand):
# Raise an error if any migrations are applied before their dependencies.
for db in connections:
loader.check_consistent_history(connections[db])
connection = connections[db]
if connection.settings_dict['ENGINE'] != 'django.db.backends.dummy':
loader.check_consistent_history(connection)
# Before anything else, see if there's conflicting apps and drop out
# hard if there are any and they don't want to merge

View File

@ -9,7 +9,9 @@ import sys
from django.apps import apps
from django.core.management import CommandError, call_command
from django.db import DatabaseError, connection, connections, models
from django.db import (
ConnectionHandler, DatabaseError, connection, connections, models,
)
from django.db.migrations.exceptions import InconsistentMigrationHistory
from django.db.migrations.recorder import MigrationRecorder
from django.test import ignore_warnings, mock, override_settings
@ -580,6 +582,19 @@ class MakeMigrationsTests(MigrationTestBase):
call_command('makemigrations', 'migrations', '--empty', '-n', 'a', '-v', '0')
self.assertTrue(os.path.exists(os.path.join(migration_dir, '0002_a.py')))
def test_makemigrations_empty_connections(self):
empty_connections = ConnectionHandler({'default': {}})
with mock.patch('django.core.management.commands.makemigrations.connections', new=empty_connections):
# with no apps
out = six.StringIO()
call_command('makemigrations', stdout=out)
self.assertIn('No changes detected', out.getvalue())
# with an app
with self.temporary_migration_module() as migration_dir:
call_command('makemigrations', 'migrations', verbosity=0)
init_file = os.path.join(migration_dir, '__init__.py')
self.assertTrue(os.path.exists(init_file))
def test_failing_migration(self):
# If a migration fails to serialize, it shouldn't generate an empty file. #21280
apps.register_model('migrations', UnserializableModel)