diff options
| author | Claude Paroz <claude@2xlibre.net> | 2014-04-30 16:53:20 +0200 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2014-04-30 16:55:12 +0200 |
| commit | 1084456ac2e707fc562906e95ad78f409dcc9325 (patch) | |
| tree | ca7f62d02784462c983f0caef250fa0b71535fdf | |
| parent | bb5c7e4e8d783bf3a2880ab5cf1fa57fd35cd198 (diff) | |
[1.7.x] Fixed #22474 -- Made migration recorder aware of multiple databases
Thanks Tim Graham for the review.
Backport of 7c54f8cce from master.
| -rw-r--r-- | django/db/migrations/recorder.py | 20 | ||||
| -rw-r--r-- | 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(), |
