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

     2023-02-24     170

关键词:

【中文标题】django 如何知道已经运行了哪些迁移?【英文标题】:How does django know which migrations have been run? 【发布时间】:2015-02-10 09:35:17 【问题描述】:

django 如何知道是否已经应用了迁移?它通常可以解决问题,但如果不正确,我不知道从哪里开始进行故障排除。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

【参考方案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

【讨论】:

Showmigrations 列出了 Django 知道的迁移以及它们是否已被应用。但是它通过查看 django_migrations 表来生成这个列表。每当您运行迁移或成功回滚迁移时,此表都会更新。【参考方案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。 South 还将迁移存储在数据库中,您可以启用在 django admin 中显示迁移历史记录的功能。

【讨论】:

看起来 South 在表 south_migrationhistory 中存储了迁移历史,虽然我还没有找到官方文档来确认。 您知道如何启用该功能以在管理员中显示迁移吗?我在文档中找不到它,我自己也没有运气。 @skolsuper 也许有更好的解决方案,但您可以像这里github.com/django/django/blob/… 那样描述迁移模型,然后像通常的模型一样简单地将其包含给管理员【参考方案5】:

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

【讨论】:

@alecxe 在我的迁移历史表中存在行applied timestamp @coldmind 我的错,这是正确的。 applied 不是布尔标志 - 它是 datetimefield。谢谢! 在我的情况下,django_migrations 表中已经有一个条目,其中一行列出了我的应用程序和迁移(在这种情况下为0001 initial)。然而,当我打电话给./manage.py migrate 时,django 仍然尝试应用相同的迁移。 ./manage.py migrate <app> --fake-initialdjango_migrations 中创建了另一行,具有相同的 appname 字段(当然,不同的 appliedid)。然后./manage.py migrate 最终报告没有要申请的迁移。这表明接受的答案是不完整的 - 为什么 django 会尝试应用已经列出的迁移?

将迁移标记为在 laravel 中运行

...移标记为完成?这样当我运行未来的迁移时,它会跳过我知道不需要运行的迁移。我可以用这个命令列出它们和它们的状态,看看哪些已经运行,哪些没有运行:phpartisanmigrate 查看详情

不知道为啥 django South 试图运行反向迁移

】不知道为啥djangoSouth试图运行反向迁移【英文标题】:NotsurewhydjangoSouthistryingtorunreversemigration不知道为什么djangoSouth试图运行反向迁移【发布时间】:2012-05-0413:40:48【问题描述】:当我运行pythonmanage.pymigrateapi时,它会失败并显... 查看详情

如何在 Dockerized Django 中运行迁移?

】如何在DockerizedDjango中运行迁移?【英文标题】:HowdoIrunmigrationsinDockerizedDjango?【发布时间】:2018-07-2020:17:14【问题描述】:我关注了Docker+Djangotutorial,这很棒,因为我可以按照说明成功构建和运行网站。但是,我一生都无法弄... 查看详情

如何运行迁移并添加电话号码

...:55:25【问题描述】:我正在创建一个带有电话号码字段的django模型表单。我已经pip安装了phonenumber字段模块并将其添加到我已安装的应用程序中,但现在当我尝试运行迁移以将此字段的表单添加到我的数据库中时。我得到这个错... 查看详情

如何将 Django 项目迁移到 Pythonanywhere

】如何将Django项目迁移到Pythonanywhere【英文标题】:HowtomigrateDjangoprojecttoPythonanywhere【发布时间】:2014-05-0705:18:21【问题描述】:我正在尝试在Pythonanywhere上设置一个Django应用程序——我已经设法找出Bitbucket并将代码克隆到其中—... 查看详情

django迁移脚本

...有问题,那么会将相关的迁移脚本的名字记录到数据库中django_migrations表中migrate怎么判断哪些迁移脚本需要执行?migrate会将代码中的迁移脚本和数据库中的迁移脚本 查看详情

如果 Django 中已经存在某些表,如何强制迁移到数据库?

】如果Django中已经存在某些表,如何强制迁移到数据库?【英文标题】:HowtoforcemigrationstoaDBifsometablesalreadyexistinDjango?【发布时间】:2017-10-0809:23:00【问题描述】:我有一个Python/Django项目。由于一些回滚和其他混合因素,我们最... 查看详情

Django 无法迁移内容类型迁移

】Django无法迁移内容类型迁移【英文标题】:Djongofailstomigratecontenttypesmigrations【发布时间】:2021-09-0815:18:11【问题描述】:我在我的项目中使用djongo进行MongoDB连接。我已经清理了所有以前的迁移,删除了sqlite数据库并再次为应... 查看详情

如何查看在 Django 的 manage.py test 命令期间运行了哪些测试

】如何查看在Django的manage.pytest命令期间运行了哪些测试【英文标题】:HowtoseewhichtestswererunduringDjango\'smanage.pytestcommand【发布时间】:2014-02-2508:16:53【问题描述】:使用Django的manage.pytest命令完成测试执行后,只有通过的测试数量... 查看详情

在 Django 中,您可以在不总是生成迁移的情况下运行种子数据吗?

】在Django中,您可以在不总是生成迁移的情况下运行种子数据吗?【英文标题】:InDjango,canyourunseeddatawithoutalwaysgeneratingamigration?【发布时间】:2019-08-1107:45:28【问题描述】:我正在使用Django和Python3.7。我已经为我的数据库创建了... 查看详情

如何一次运行 Laravel artisan 迁移?

】如何一次运行Laravelartisan迁移?【英文标题】:HowtorunLaravel\'sartisanmigrateonestepatatime?【发布时间】:2015-08-2822:26:13【问题描述】:我已经阅读了Runningonespecificlaravel4migration(singlefile),但这并没有给我答案。我想知道是否有一种方... 查看详情

重新运行 Django 数据迁移

】重新运行Django数据迁移【英文标题】:RerunaDjangodatamigration【发布时间】:2015-11-0409:01:42【问题描述】:如何在Django1.8+上重新运行数据迁移?如果相关,我的迁移编号为0011_my_data_migration.py,是最新的迁移。【问题讨论】:请注... 查看详情

confluent s3 源连接器如何知道它已经摄取了哪些文件以及哪些文件是新的?

】confluents3源连接器如何知道它已经摄取了哪些文件以及哪些文件是新的?【英文标题】:howdoestheconfluents3sourceconnectorknowwhichfilesithasalreadyingestedandwhichonesarenew?【发布时间】:2021-07-0217:40:54【问题描述】:https://docs.confluent.io/kafka-... 查看详情

修改 Django 迁移文件,或使用 --fake 标志?

】修改Django迁移文件,或使用--fake标志?【英文标题】:ModifyDjangomigrationsfile,oruse--fakeflag?【发布时间】:2021-12-3103:44:39【问题描述】:我是Django新手,我正在重命名一些旧表。我还采用了一些表中已经存在的字段,并将它们设... 查看详情

压缩 Django 迁移时的循环依赖

】压缩Django迁移时的循环依赖【英文标题】:CirculardependencywhensquashingDjangomigrations【发布时间】:2016-10-0905:55:58【问题描述】:我们已经创建了一个大型Django应用程序,并且我们想要压缩迁移。但是,压缩迁移在我们应用程序中... 查看详情

如何在heroku中应用特定的django数据库迁移?

】如何在heroku中应用特定的django数据库迁移?【英文标题】:Howtoapplyaparticulardjangodatabasemigrationinheroku?【发布时间】:2015-11-1213:53:48【问题描述】:我上传了修改后的代码,其中对模型进行了一些更改。当我运行herokurunpythonmanage.... 查看详情

Django 压缩迁移:NodeNotFoundError

】Django压缩迁移:NodeNotFoundError【英文标题】:Djangosquashedmigrations:NodeNotFoundError【发布时间】:2016-06-1423:52:43【问题描述】:运行Django1.8.9。我刚刚压缩了3个应用程序的迁移并进行了部署。当./manage.pymigrate运行时,我得到了这个... 查看详情

在 Django 数据迁移中手动提交

】在Django数据迁移中手动提交【英文标题】:CommitmanuallyinDjangodatamigration【发布时间】:2015-09-2317:10:39【问题描述】:我想编写一个数据迁移,在其中我以较小的批量修改大表中的所有行,以避免锁定问题。但是,我不知道如何... 查看详情