mirror of https://github.com/django/django.git
[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:
parent
39387efbba
commit
ddcf7dbae7
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue