Ответ 1
Django записывает запись в таблицу django_migrations
, состоящую из некоторой информации, такой как приложение, к которому относится миграция, имя миграции и дата, когда она была применена.
Как django знает, была ли еще применена миграция? Обычно это правильно, но когда это не так, я никогда не знаю, где начать поиск и устранение неисправностей.
Django записывает запись в таблицу django_migrations
, состоящую из некоторой информации, такой как приложение, к которому относится миграция, имя миграции и дата, когда она была применена.
Вы можете просто использовать команду 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
Как утверждают другие ответы, 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)
Если это django1.7, он хранит историю в базе данных, таблицу django_migrations
.
Юг также хранит миграцию в базе данных, и вы можете включить функцию для отображения истории миграции в администраторе django.
Использование 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, в котором используется несколько источников информации, одна из которых включает в себя таблицу с именами всех буквенных имен применяемых миграций. Как вы переходите от одного к другому... читайте исходный код.