[1.10.x] Fixed #26930 -- Prevented makemigrations from accessing an empty database.

Thanks Liz Lemon for the report and investigation and
Claude Paroz for the test.

Backport of aad46c3e37 from master
This commit is contained in:
Tim Graham 2016-08-01 07:57:12 -04:00
parent 39387efbba
commit ddcf7dbae7
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)