为什么 Django 禁止迁移图中有多个叶子?

问题描述 投票:0回答:1

即时问题

当迁移图中存在多个叶子时,Django 拒绝迁移的原因是什么?我认为原因与 SQLAlchemy 文档 中描述的类似:

分支的挑战是将分支合并为一系列更改,以便分别从任一源树建立的数据库可以升级以同等地引用合并的结果。

换句话说,如果我们不必处理位于不同 HEADS 中的多个数据库,那么当我们有多个叶子时,还会出现哪些其他可能的问题(除了未完全定义迁移的应用顺序之外)?

我修改 django 后运行 migrate 命令以不执行此检查,并且没有出现问题。

但是,django 似乎不支持此用例,因为除了猴子补丁/使用分叉的 django 之外,没有其他方法可以覆盖检查行为。

我为什么要问

我们正在实现一种机制来处理 Django 应用程序上的无停机迁移。特别是,我们正在处理长时间运行的迁移,我们希望将其与短期运行的迁移分开应用。

这意味着我们有两组独立应用的迁移,每组都有自己的 HEAD。

我们有一个自定义机制来仅运行给定类型的迁移。但是,迁移命令失败并显示

检测到冲突的迁移;迁移图中的多个叶节点:要修复它们,请运行 'python manage.py makemigrations --merge

当有多个叶子时。

django django-migrations
1个回答
0
投票

我最近遇到了类似的问题。它发生在默认的身份验证表中。运行合并并没有解决问题。我的问题是在 auth. 0001-init 这个表有一个字段first_name,其中max_length 设置为30。(我创建了一个自定义用户模型)。后来在 django_migrations 表列表中是 0012_alter_user_first_name_max_length.py 迁移,它想要将此值重置为 150 (在我的情况下,这在某种程度上与 group_permissions 表的设置有关)。这显然会导致与自定义用户模型的初始设置发生冲突。我只是编辑了第二个迁移文件以对应于初始设置值,然后重新运行迁移而不进行合并。我建议您使用 mysqlworkbench 并在 django_migrations 中获取迁移列表,或者在终端中运行 python manage.py makemigrations,然后运行 django manage.py showmigrations。然后在 vscode 之类的编辑器中打开每个迁移文件(使用终端不带“x”的文件),并尝试查找初始.py 迁移和后续迁移之间指定值的任何重复或差异。您可能还需要检查依赖项下迁移文件顶部列出的文件。依赖文件也可能为字段名称分配了冲突的值。

© www.soinside.com 2019 - 2024. All rights reserved.