如何解决由于更改迁移文件名而导致的数据库迁移错误?

How do I resolve database migration error due to changed migration filename?

我对 Python 和 Django 还是很陌生,所以我遇到了一种情况,我不确定如何解决。

主要问题是,在将我的代码部署到开发时,部署失败,到暂存或生产时,它通过了。

我解决了一个问题,我不得不在我们的应用程序的 table 中删除一些列。 进行更改后,我部署到开发人员并要求进行代码审查。 在代码审查中,有人建议我将迁移文件的名称更改为更具描述性的名称,而不仅仅是保留它 0018_auto_.

我进行了更改并部署到开发和阶段。 Dev 失败了(当我期望它成功时),因为看到了新名称并且 django 试图删除不再存在的列。在阶段中,名称从未更改,并且使用文件的新名称首次删除了列。

所以舞台部署得很好。

我如何解决 dev 上的这个错误,以便它识别此迁移已经发生?

谢谢!

如果您 100% 确定 0018 所做的唯一更改是文件名,并且这是您应用的最后一次迁移,您可以执行以下操作:

python manage.py migrate myapp 0017 --fake # Move to 17 without removing changes done by 18
python manage.py migrate myapp 0018 --fake # 18 is already applied, so just migrate with the new filename

这将保留 0018 中的更改,并将更改应用到文件名。

Django 构造了一个名为 djang_migrations 的 table 来跟踪已应用的迁移。如果您稍后更改迁移文件的名称,那么它将看起来好像该迁移没有 运行。

您可以在开发环境的 django_migrations table 中重命名迁移:

UPDATE django_migrations
<strong>SET name = '<em>0018_new_name</em>'</strong>
WHERE app = '%%%name_of_the_app'
  AND name = '0018_auto_'

其中 0018_new_name 是迁移文件的新名称。

通过更新这个名称,Django 现在应该认为新的迁移文件已经完成。

所有这些都是很好的答案,毫无疑问现在和将来都会对其他人有所帮助!

我尝试了所有这些答案,但只有一个有效。任重而道远!

为了完全可见(这在本地有效 并且我理解 --fake 现在在实践中,感谢@brian-destura!):

python manage.py migrate myapp 0017 --fake # Move to 17 without removing changes done by 18
python manage.py migrate myapp 0018 --fake # 18 is already applied, so just migrate with the new filename

在通过 gitlab 部署时,我们的 django / zappa 应用程序只是不想成功部署(即使尝试了许多不同的解决方案)。

最后,解决问题的唯一方法是更新 0018 迁移文件以添加回所有这些字段,回滚模型和序列化程序中的更改,然后重新部署到 dev。

之后,还原所有这些更改,包括迁移文件,并再次重新部署到开发人员。

可能有一些更简单的方法可以做到这一点,但是所有那些拥有更多后端知识的人都在假期里出去了(我最初是一个前端,在去年有更多的后端 knowledge/projects),我非常很高兴解决并发布我的更改。

感谢你们提供的一些尝试、想法和定义知识,我可以用来创建这个我自己冗长的解决方案!