关键词:
【中文标题】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-initial
在 django_migrations
中创建了另一行,具有相同的 app
和 name
字段(当然,不同的 applied
和 id
)。然后./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【问题描述】:我想编写一个数据迁移,在其中我以较小的批量修改大表中的所有行,以避免锁定问题。但是,我不知道如何... 查看详情