重新运行 Django 数据迁移

     2023-02-24     305

关键词:

【中文标题】重新运行 Django 数据迁移【英文标题】:Rerun a Django data migration 【发布时间】:2015-11-04 09:01:42 【问题描述】:

如何在 Django 1.8+ 上重新运行数据迁移?如果相关,我的迁移编号为 0011_my_data_migration.py,是最新的迁移。

【问题讨论】:

请注意,Q 和解决方案仍在 Django 2.1 上运行 【参考方案1】:

根据接受的答案,这是重新应用给定迁移的脚本。

#! /bin/bash
# This script re-applies a given migration.
app_name="$1"
migration_index="$2"

prev_migration_index="$(echo "$migration_index" | sed 's/^0*//' | awk ' print $1 - 1 ' | xargs printf "%04d")"
last_migration_index="$(django-admin showmigrations --plan | grep -oP "\.\K\d4" | sort | tail -n 1)"

# fake-migrate to the migration prior to the one we want to reapply
django-admin migrate --fake "$app_name" "$prev_migration_index"
# reapply the migration
django-admin migrate "$app_name" "$migration_index"
# fake-migrate to the last migration
django-admin migrate --fake "$app_name" "$last_migration_index"

用法:

$ bash reapply_migration.sh <app_name> <migration_to_reapply_index>

【讨论】:

【参考方案2】:

Alasdair 的回答对此给出了免责声明,但只有在您的迁移是幂等的情况下,伪造迁移回前一个迁移才是安全的,这意味着您可以多次运行它而不会产生重复数据等副作用。大多数人不会以这种方式编写迁移,但这是一种很好的做法。

您有两个选项可以确保此过程安全:

    使您的数据迁移具有幂等性。这意味着任何创建的数据要么被重复使用(如Model.objects.get_or_create() 方法),要么被删除并重新创建。重用是更好的选择,因为删除和重新创建会更改数据库索引和序列。 进行反向数据迁移。您可以通过将 2 个函数传递给 migrations.RunPython() 来做到这一点。例如,如果您有 migrations.RunPython(add_countries),您可以将其更改为 migrations.RunPython(add_countries, remove_countries),并在第二个函数中删除所有相关国家/地区。

如果您选择选项 #2,那么您将运行:

./manage.py migrate yourapp 0010_my_previous_data_migration
./manage.py migrate yourapp 0011_my_data_migration

如果你想把它做成一个衬里,这样你就可以反复使用它:

./manage.py migrate yourapp 0010_my_previous_data_migration && ./manage.py migrate yourapp 0011_my_data_migration

【讨论】:

你应该在单行中使用--fake 吗? 不,这是来自 OP 的复制和粘贴错误。固定。【参考方案3】:

在您要重新运行的迁移之前伪造回迁移。

./manage.py migrate --fake yourapp 0010_my_previous_data_migration

然后重新运行迁移。

./manage.py migrate yourapp 0011_my_data_migration

然后,您可以伪造回您已运行的最新迁移。在你的情况下,你说 0011 是最新的,所以你可以跳过这个阶段。

./manage.py migrate --fake yourapp 0014_my_latest_data_migration

请注意,根据数据库的状态和迁移的内容,像这样重新运行迁移可能会导致错误。请注意关于 --fake 选项的警告 in the docs:

这是供高级用户在手动应用更改时直接操作当前迁移状态的;请注意,使用--fake 存在将迁移状态表置于需要手动恢复以使迁移正确运行的状态的风险。

【讨论】:

./manage.py migrate --fake yourapp zero 如果是第一次迁移。 如果你需要真正找到之前的迁移,另一个有用的命令是./manage.py showmigrations

Django 1.7 迁移不会重新创建删除的表,为啥?

】Django1.7迁移不会重新创建删除的表,为啥?【英文标题】:Django1.7migrationswon\'trecreateadroppedtable,why?Django1.7迁移不会重新创建删除的表,为什么?【发布时间】:2014-12-3001:11:26【问题描述】:使用Django1.7迁移。我不小心在我的数... 查看详情

Django 1.7 迁移挂起

...谷歌搜索,我发现其他打开的连接可能会弄乱它,所以我重新启动了数据库。然而,这个数据库连接到持续运行的作业,并且新的 查看详情

django迁移地狱,丢了一张桌子。试图找回它

...:所以我在我的数据库中删除了一个表,我想要它回来。重新运行迁移给出了错误表不存在。经过一番打猎后,我了解到我可以删除django_migrations中应用程序名称为我的应用程序的所有内容。所以我这样做了,重新运行它 查看详情

石墨烯代码在 Django 数据迁移之前运行

】石墨烯代码在Django数据迁移之前运行【英文标题】:graphenecoderunbeforedjangodatamigrations【发布时间】:2021-12-0110:20:11【问题描述】:我写了一段代码,从数据库中动态生成石墨烯输入对象类型。当我尝试运行时./manage.pymigrate该代... 查看详情

Django 迁移错误:字段“名称”没有默认值

...Django应用程序。它在旧版本的debianlinux上运行,该版本已重新安装,现在是9.6。原来数据库是mysql(默认debian安装),现在是m 查看详情

检查挂起的 Django 迁移

...,是否有一种简单的方法可以检查所有数据库迁移是否已运行?我找到了manage.pymigrate--list,它提供了我想要的信息,但格式不是机器可读的。对于上下文:我有一个脚本在迁移数据库之前不应开始运行。由于各种原因,从运行... 查看详情

django迁移问题

...极解决方案原理:就是将之前的那些迁移脚本都不用了。重新来过。要将出问题的app下的所有模型和数据库中表保持一致,重新映射。2.将出问题的app下的所有模型,都和数据库中的表保持一致。3.将出问题的app 查看详情

使用django框架创建项目和运行(包括默认数据库迁移)(代码片段)

一、Django框架创建项目和运行 1.1.项目创建#myproject为项目名,自己定义django-adminstartprojectmyproject1.2.运行开发服务器#运行服务默认端口为8000,ip为127.0.0.1但是其他ip无法远程pythonmanage.pyrunserver#可远程的运行方式pythonmanage.p... 查看详情

使用django框架创建项目和运行(包括默认数据库迁移)(代码片段)

一、Django框架创建项目和运行 1.1.项目创建#myproject为项目名,自己定义django-adminstartprojectmyproject1.2.运行开发服务器#运行服务默认端口为8000,ip为127.0.0.1但是其他ip无法远程pythonmanage.pyrunserver#可远程的运行方式pythonmanage.p... 查看详情

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

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

将数据库从本地 django 迁移到 heroku

...】:我在Django中有一个应用程序,我部署在heroku中。部署运行良好,但我的模型的数据库没有迁移。部署后,我再次本地运行:pythonmanage.pymakemigrationspythonmanage.pymigrate之后,我会这 查看详情

没有数据库迁移和同步数据库的 Django 测试用例

...grations.RunPython调用)。我的想法是创建一个在开始之前不运行迁移的测试用例,也不是syncdb一步创建数据库。在此之后,我计划运行第一步,运行相关测试, 查看详情

Django 迁移:如何只允许在 --fake 模式下运行?

】Django迁移:如何只允许在--fake模式下运行?【英文标题】:Djangomigration:howtoonlyallowrunningin--fakemode?【发布时间】:2015-09-2209:12:32【问题描述】:我正在从Django1.6升级到1.8因此,存在大量迁移和一些向后(不)兼容性问题,我正... 查看详情

如何在 Dockerized Django 中运行迁移?

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

运行 make 迁移时出现 Django 关系错误

】运行make迁移时出现Django关系错误【英文标题】:Djangorelationerrorwhenrunningmakemigrations【发布时间】:2016-12-2906:15:19【问题描述】:嘿,我正在尝试初始化一个新数据库,但在设置迁移时遇到了一些问题。我得到的错误似乎源于设... 查看详情

在 Django 数据迁移中手动提交

...但是,我不知道如何在Django迁移中手动提交。每次我尝试运行commit我都会得到:TransactionManagementError:当“原子”块处于活动状态时,这是禁止的。 查看详情

South - 将 django 应用程序从 sqlite 迁移到 mysql

...想将其全部转移到将在盒子上使用的mySQL。我将我的设置重新配置为mysql数据库并运行manag 查看详情

如何为新服务器运行迁移

】如何为新服务器运行迁移【英文标题】:Howtorunmigrationsforanewserver【发布时间】:2015-09-0815:36:31【问题描述】:我正在尝试在Heroku上部署我的Django-cms站点,但我真的在为迁移而苦苦挣扎。我正在运行django1.7.7和django-cms3.1.0。我... 查看详情