django如何知道哪些迁移已经运行?

Bos*_*ohn 31 python django database-migration django-migrations

django如何知道迁移是否已经应用?它通常是正确的,但如果它没有,我不知道从哪里开始故障排除.

mip*_*adi 32

Django在表中写入一条记录,django_migrations其中包含一些信息,例如迁移所属的应用程序,迁移的名称以及应用的日期.


Dea*_*ano 13

您只需使用showmigrations命令提供迁移列表即可

$ python manage.py showmigrations
Run Code Online (Sandbox Code Playgroud)

是否应用每个迁移(由迁移名称旁边的[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
Run Code Online (Sandbox Code Playgroud)

  • Showmigrations 列出了 Django 知道的迁移以及它们是否已应用。但它通过查看 django_migrations 表来生成此列表。每当您运行迁移或成功回滚迁移时,此表都会更新。 (2认同)

ale*_*cxe 7

正如其他答案所述,django有一个特殊的表django_migrations来保存迁移历史记录.

如果你有兴趣挖掘更多的点燃位,见MigrationRecorder,它负责在数据库中记录迁移.此外,这是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)
Run Code Online (Sandbox Code Playgroud)


Ala*_*nSE 7

使用 showmigrations非常适合基本用例。希望你永远不必使用除此之外的任何东西。但是,如果您开始使用“替换”功能来压缩迁移,则预期的行为可能变得非常重要。

作为“Django 如何知道已经运行了哪些迁移?”问题的答案的一部分,它们将应用迁移的记录存储在数据库中!

如果您想看一看它们存储在数据库中的内容,请使用 Django shell 查看以下内容。

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

对于简单的情况,这应该直接与您显示的内容一一对应showmigrations。但是,压缩了一些迁移(将一些迁移替换为其他迁移),您应该知道 Django 将存储在数据库中的迁移与存储在磁盘上的迁移进行比较,并且该过程变得非常重要。

因此,将这个答案细化为“Django 如何知道已经运行了哪些迁移?” 该命令showmigrations显示了Django 迁移解析算法的结果,该算法使用多种信息源,其中之一包括一个表,其中包含已应用的迁移的所有字面名称的名称。关于你如何从一个到另一个......阅读源代码。