From 7c54f8cced37313572d72f59bd2ef7ce12aa8fe1 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Wed, 30 Apr 2014 16:53:20 +0200 Subject: [PATCH] Fixed #22474 -- Made migration recorder aware of multiple databases Thanks Tim Graham for the review. --- django/db/migrations/recorder.py | 20 ++++++++++++++------ tests/migrations/test_loader.py | 8 +++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/django/db/migrations/recorder.py b/django/db/migrations/recorder.py index 15a3b49578..4c85ebd6d1 100644 --- a/django/db/migrations/recorder.py +++ b/django/db/migrations/recorder.py @@ -1,5 +1,6 @@ from django.apps.registry import Apps from django.db import models +from django.utils.encoding import python_2_unicode_compatible from django.utils.timezone import now @@ -16,6 +17,7 @@ class MigrationRecorder(object): a row in the table always means a migration is applied. """ + @python_2_unicode_compatible class Migration(models.Model): app = models.CharField(max_length=255) name = models.CharField(max_length=255) @@ -26,9 +28,16 @@ class MigrationRecorder(object): app_label = "migrations" db_table = "django_migrations" + def __str__(self): + return "Migration %s for %s" % (self.name, self.app) + def __init__(self, connection): self.connection = connection + @property + def migration_qs(self): + return self.Migration.objects.using(self.connection.alias) + def ensure_schema(self): """ Ensures the table exists and has the correct schema. @@ -46,25 +55,24 @@ class MigrationRecorder(object): Returns a set of (app, name) of applied migrations. """ self.ensure_schema() - return set(tuple(x) for x in self.Migration.objects.values_list("app", "name")) + return set(tuple(x) for x in self.migration_qs.values_list("app", "name")) def record_applied(self, app, name): """ Records that a migration was applied. """ self.ensure_schema() - self.Migration.objects.create(app=app, name=name) + self.migration_qs.create(app=app, name=name) def record_unapplied(self, app, name): """ Records that a migration was unapplied. """ self.ensure_schema() - self.Migration.objects.filter(app=app, name=name).delete() + self.migration_qs.filter(app=app, name=name).delete() - @classmethod - def flush(cls): + def flush(self): """ Deletes all migration records. Useful if you're testing migrations. """ - cls.Migration.objects.all().delete() + self.migration_qs.all().delete() diff --git a/tests/migrations/test_loader.py b/tests/migrations/test_loader.py index f661a03b02..0e9b9c23d7 100644 --- a/tests/migrations/test_loader.py +++ b/tests/migrations/test_loader.py @@ -1,7 +1,7 @@ from unittest import skipIf from django.test import TestCase, override_settings -from django.db import connection +from django.db import connection, connections from django.db.migrations.loader import MigrationLoader, AmbiguityError from django.db.migrations.recorder import MigrationRecorder from django.utils import six @@ -26,6 +26,12 @@ class RecorderTests(TestCase): recorder.applied_migrations(), set([("myapp", "0432_ponies")]), ) + # That should not affect records of another database + recorder_other = MigrationRecorder(connections['other']) + self.assertEqual( + recorder_other.applied_migrations(), + set(), + ) recorder.record_unapplied("myapp", "0432_ponies") self.assertEqual( recorder.applied_migrations(),