mirror of
https://github.com/django/django.git
synced 2025-10-27 15:46:10 +00:00
[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:
@@ -95,7 +95,9 @@ class Command(BaseCommand):
|
|||||||
|
|
||||||
# Raise an error if any migrations are applied before their dependencies.
|
# Raise an error if any migrations are applied before their dependencies.
|
||||||
for db in connections:
|
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
|
# Before anything else, see if there's conflicting apps and drop out
|
||||||
# hard if there are any and they don't want to merge
|
# 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.apps import apps
|
||||||
from django.core.management import CommandError, call_command
|
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.exceptions import InconsistentMigrationHistory
|
||||||
from django.db.migrations.recorder import MigrationRecorder
|
from django.db.migrations.recorder import MigrationRecorder
|
||||||
from django.test import ignore_warnings, mock, override_settings
|
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')
|
call_command('makemigrations', 'migrations', '--empty', '-n', 'a', '-v', '0')
|
||||||
self.assertTrue(os.path.exists(os.path.join(migration_dir, '0002_a.py')))
|
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):
|
def test_failing_migration(self):
|
||||||
# If a migration fails to serialize, it shouldn't generate an empty file. #21280
|
# If a migration fails to serialize, it shouldn't generate an empty file. #21280
|
||||||
apps.register_model('migrations', UnserializableModel)
|
apps.register_model('migrations', UnserializableModel)
|
||||||
|
|||||||
Reference in New Issue
Block a user