django如何知道迁移是否已应用?它通常是正确的,但是当它没有时,我不知道从哪里开始排除故障。
答案 0 :(得分:29)
Django将记录写入表django_migrations
,其中包含一些信息,例如迁移所属的应用程序,迁移的名称以及应用的日期。
答案 1 :(得分:10)
您只需使用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
答案 2 :(得分:7)
正如其他答案所述,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)
答案 3 :(得分:4)
如果是django1.7,它会将历史记录存储到数据库表django_migrations
。
South还将迁移存储在数据库中,您可以启用功能以在django admin中显示迁移历史记录。
答案 4 :(得分:2)
使用showmigrations
非常适合基本用例。希望你永远不必使用任何东西。但是,如果你开始使用"替换"压缩迁移的功能,预期的行为可能变得非常重要。
作为问题答案的一部分" Django如何知道已经运行了哪些迁移?",它们将应用迁移的记录存储在数据库中!
如果你想看一下他们在数据库中存储的内容,请使用Django shell获取以下内容。
from django.db.migrations.recorder import MigrationRecorder
[(m.app, m.name) for m in MigrationRecorder.Migration.objects.all()]
对于简单的情况,这应该与您在showmigrations
中显示的内容直接对应1对1。但是,压缩了一些迁移(用其他迁移替换了一些迁移),你应该知道Django将存储在数据库中的迁移与存储在磁盘上的迁移进行比较,这个过程变得非常简单。
所以要改进这个答案" Django如何知道哪些迁移已经运行?"命令showmigrations
显示了Django迁移解析算法的结果,它使用了几个信息源,其中一个包含一个表格,其中包含所有文字名称的名称。已应用的迁移。关于你如何从一个到另一个...阅读源代码。