Django 迁移与迁移图中的多个叶节点发生冲突

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

使用 Django 1.11.22 我正在尝试运行迁移

python manage.py migrate
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration base.0036_auto_20190227_1226 is applied before its dependency base.0027_auto_20170801_1228_squashed_0037_auto_20190222_1347 on database 'default'.

我第一次尝试解决这个问题是

sudo -u postgres psql -d albatros -c \
"DELETE FROM django_migrations WHERE name = '0036_auto_20190227_1226' AND app = 'base'"

希望从迁移表中删除迁移可以修复它。不幸的是我现在得到:

CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0037_auto_20190222_1347, 0036_auto_20190227_1226 in base).
To fix them run 'python manage.py makemigrations --merge'

当尝试 makemigrations --merge 时,它没有找到任何要合并的迁移。这就是 showmigrations 的样子:

 ./manage.py  showmigrations base
base
 [X] 24_initial
 [X] 24_to_26
 [X] 26_to_27
 [X] 0027_auto_20170801_1228
 [X] 0028_resourcebase_is_approved
 [X] 0029_auto_20171114_0341
 [X] 0030_auto_20180309_0833
 [X] 0031_auto_20180309_0837
 [X] 0032_auto_20180329_1844
 [X] 0033_auto_20180330_0951
 [X] 0034_auto_20180606_1543
 [X] 0035_resourcebase_dirty_state
 [ ] 0036_auto_20190227_1226
 [ ] 0036_auto_20190129_1433
 [ ] 0037_auto_20190222_1347

能说说如何正确应用迁移并解决多叶节点错误吗?

django django-migrations
5个回答
10
投票

在这 2 个迁移文件(0037_auto_20190222_1347、0036_auto_20190227_1226)中,您具有相同的依赖项,请检查它们。它们看起来像是一个包含元组的列表

dependencies = [
    ('round', '0008_auto_20200116_0752'),
]

您需要手动将“0036_auto_20190227_1226”写入0037_auto_20190222_1347文件依赖变量。


2
投票

每个 django 迁移都包含一个引用之前迁移的依赖项,就好像它是面包屑一样,这是通过迁移文件夹中的文件以及通过

django_migrations
表中的数据库进行控制的。每个迁移文件都有一行类似这样的内容:

dependencies = [
     ('round', '0008_auto_20200116_0752'),
]

其中元组的第二个参数必须与 django_migrations 表中数据库中必须存在的名称完全相同。这样树就不能有松散的节点,请确保你的数据库在 django_migrations 表中通过依赖关系与每个文件的迁移顺序保持一致:

dependencies = [
     ('round', '0008_auto_20200116_0752'),
]

0
投票

解决此问题的另一种方法是使用 django-migration-fixer

可以使用

修复开发分支上的迁移
$ git checkout [dev-branch]
$ git merge [main/master]

按照安装说明进行操作此处

奔跑

$ python manage.py makemigrations --fix -b [main/master]

提交更改并推送到远程分支

$ git add .
$ git commit -am ...
$ git push ...

0
投票

Django 中的迁移必须依赖于之前的迁移。当您收到

CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph
错误时,这意味着您的某些迁移具有多个彼此不依赖的叶节点。要快速解决此问题,您可以运行
python manage.py makemigrations --merge
命令或通过更改依赖项手动修复它。


-2
投票

您可以合并迁移并进行迁移

(venv)yourprj$python manage.py makemigrations --merge
(venv)yourprj$python manage.py migrate
© www.soinside.com 2019 - 2024. All rights reserved.