Как django знает, какие миграции были запущены?

Как django знает, была ли еще применена миграция? Обычно это правильно, но когда это не так, я никогда не знаю, где начать поиск и устранение неисправностей.

Ответы

Ответ 1

Django записывает запись в таблицу django_migrations, состоящую из некоторой информации, такой как приложение, к которому относится миграция, имя миграции и дата, когда она была применена.

Ответ 2

Вы можете просто использовать команду showmigrations, чтобы предоставить список миграций

$ python manage.py showmigrations

применяется ли каждая миграция (помечена знаком [X] рядом с именем миграции).

~/workspace $ python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

Ответ 3

Как утверждают другие ответы, django имеет специальную таблицу django_migrations, где хранится история миграции.

Если вы заинтересованы в том, чтобы выкопать более освещенный бит, см. MigrationRecorder class, который отвечает за запись миграции в базе данных. Кроме того, вот базовая модель для таблицы django_migrations:

class Migration(models.Model):
    app = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    applied = models.DateTimeField(default=now)

    class Meta:
        apps = Apps()
        app_label = "migrations"
        db_table = "django_migrations"

    def __str__(self):
        return "Migration %s for %s" % (self.name, self.app)

Ответ 4

Если это django1.7, он хранит историю в базе данных, таблицу django_migrations. Юг также хранит миграцию в базе данных, и вы можете включить функцию для отображения истории миграции в администраторе django.

Ответ 5

Использование showmigrations отлично подходит для основного использования. Надеюсь, вам никогда не придется ничего использовать. Однако, если вы начнете использовать "заменяет" функциональность для сквош-миграции, ожидаемое поведение может стать крайне нетривиальным.

Как часть ответа на вопрос "как Django знает, какие миграции были запущены?", они хранят записи прикладных миграций в базе данных!

Если вы хотите заглянуть в то, что они хранят в базе данных, возьмите gander с помощью оболочки Django.

from django.db.migrations.recorder import MigrationRecorder
[(m.app, m.name) for m in MigrationRecorder.Migration.objects.all()]

Для простых случаев это должно непосредственно соответствовать 1-к-1 тем, что вы показываете с помощью showmigrations. Тем не менее, сжал некоторые миграции (заменил некоторые миграции другими), вы должны знать, что Django сравнивает миграции, хранящиеся в базе данных, с миграциями, хранящимися на диске, и этот процесс становится довольно нетривиальным.

Итак, чтобы уточнить этот ответ на вопрос "как Django знает, какие миграции были запущены?" Команда showmigrations показывает результат алгоритма разрешения миграции Django, в котором используется несколько источников информации, одна из которых включает в себя таблицу с именами всех буквенных имен применяемых миграций. Как вы переходите от одного к другому... читайте исходный код.