Django manage.py:在其依赖关系之前应用迁移。

56
在运行python manage.py migrate时,我遇到了这个错误:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration
<appname>.0016_auto_<date2>_<time2> is applied before its dependency
<appname>.0001_squashed_0015_auto_<date1>_<time1>

运行 python manage.py showmigrations 命令返回:

<appname>
 [X] 0001_squashed_0015_auto_<date1>_<time1> (15 squashed migrations)
 [X] 0016_auto_<date2>_<time2>
 [ ] 0017_<modelname>_squashed_0019_auto_<date3>_<time3> (3 squashed migrations)

昨天我在尝试使用django-extensions时,因为运行了一些直接的SQL查询并使用git进行了硬重置,结果一切都乱了。由于我还在学习迁移,所以我不明白出了什么问题,因为在我看来,两个迁移已经被应用了。
感谢您的帮助!
12个回答

71

这对我有用。在我搜索了许多小时之后,我感谢我的同事分享这些知识。

开始您的数据库 shell

python manage.py dbshell

使用你想要的数据库。如果你不知道,运行.databases(SQLite)或SHOW databases

mysql>use <database_name>;

获取您的应用程序下的所有迁移

mysql> select * from django_migrations where app='<app>';

您将看到所有迁移旁边的ID输出。您可能希望在其依赖项之前删除已应用的迁移:<appname>.0016_auto_<date2>_<time2>。假设它的id361

mysql> delete from django_migrations where id=361;

现在退出数据库 shell,再次运行 python manage.py migrate 命令。


3
很好的答案。一个更简单的找到要删除的迁移文件的方法是:从django_migrations表中删除name=<你在错误X中看到的名称>已应用的记录。 - Baruch Gans

16
我在自定义用户模型时解决了这个问题,以下是步骤:
  1. 删除此文件: migrations\0001_initial.py

  2. 删除此文件: db.sqlite3

  3. 将此代码放入settings.py: AUTH_USER_MODEL = 'users.CustomUser'

  4. 然后执行(makemigrations)和(migrate)

  5. 运行服务器..问题解决 :)


我使用了这个链接帮助我解决依赖性问题:

https://docs.djangoproject.com/en/3.1/topics/auth/customizing/

由于Django对于可交换模型的动态依赖功能的限制,被AUTH_USER_MODEL引用的模型必须在其应用程序的第一个迁移中创建(通常称为0001_initial);否则,您将遇到依赖性问题。

此外,当运行您的迁移时,您可能会遇到CircularDependencyError,因为Django无法自动打破循环依赖关系,因为动态依赖性。如果看到此错误,请通过将由用户模型依赖的模型移动到第二个迁移来打破循环。 (如果您想了解通常如何完成此操作,可以尝试创建两个具有ForeignKey相互引用的普通模型,并查看makemigrations如何解决该循环依赖关系。)


非常好的答案,值得更多的赞。我一直在纠结为什么我的自定义用户模型会引发这个问题。考虑到这是一个新应用程序,清空数据库是最简单的解决方法。 - Derek Adair
这应该放得更高 - Jan Thoresen

11

您已经压缩了迁移,因此依赖于 0016_auto_<date2>_<time2> 的其中一个依赖项现在是新创建的压缩迁移的一部分。同时,0016_auto_<date2>_<time2> 已经运行过,现在您正在尝试运行压缩迁移。

我个人不知道是否有自动修复此问题的方法。您需要自己解决这些问题。如果您使用版本控制,请撤销这些更改,并尝试重新考虑如何压缩迁移而不影响旧迁移。


2
是的,我也发现了类似的问题。感谢你的回答。我刚刚通过删除已压缩的数据、删除与已压缩数据有依赖关系的迁移文件以及运行"makemigrations"和"migrate"来修复了它。我认为这是 Django 项目中应该解决的问题。 - Matthias Michael Engh
嗨,兄弟@masnun, 我有同样的问题。在我的第一个迁移文件中,我有,dependencies = [ ('custom_users','latest'), ('custom_devices', '0008_remove_customdevice_os_version'), ] 我对第一个依赖项出现了错误。我应该删除它吗? - Harun-Ur-Rashid
检查数据库状态,可以使用SQL手动设置事项。 - masnun
1
嗨,我有同样的问题,并通过在数据库django_migrations表中搜索并删除与存在问题的迁移对应的行,然后按顺序应用迁移来解决该问题。 - Jaime

6

运行此命令:python manage.py dbshell

INSERT INTO public.django_migrations(app, name, applied)
VALUES ('YOUR_APP_NAME, '0017_<modelname>_squashed_0019_auto_<date3>_<time3>', now());

只要你按照要求进行操作,应该就没问题了。但是如果你的迁移涉及到对数据库做了很多更改,那么恐怕修复起来就不那么容易了。


2
  1. 编辑冲突迁移的依赖关系,使其不再引用已经应用的迁移。
  2. 然后再次运行python manage.py migrate,问题就应该解决了。

    • 警告:这只适用于数据库状态与应用冲突迁移后的状态匹配的情况。

2

您需要伪造迁移并重新迁移,只需确保您拥有数据备份,因为当您再次迁移时,您需要删除应用程序表。请确保查看展示的迁移,并按其顺序迁移未迁移的应用程序。


0

我在2020年使用Django 3.0.6时遇到了同样的问题。我尝试了所有相关的答案,但都没有成功。所以我进入了我的数据库并删除了所有表格。如果你已经做了很多工作,你必须导出相关的表格。我主要是删除了数据库中的Django文件。然后运行:

python manage.py makemigrations <my-app>

并且:

python manage.py migrate

如果有相关的表格,请导出它们。


0
  1. 在解决冲突之前,首先备份您的数据库(对于 SQLite,请使用“python manage.py dumpdata > db.json”)。
  2. 执行python manage.py dbshell以访问数据库。
  3. 从django_migrations表中删除具有冲突的迁移行。
  4. 重命名数据库中发生冲突的表
  5. 执行makemigrations和migrate命令
  6. 成功迁移后,删除新添加的表,最后恢复先前重命名的表以匹配迁移需要

0

我曾经遇到同样的问题,以下是我的解决方案。

以下是我的错误信息。

File "/usr/local/lib/python3.11/site-packages/django/db/migrations/loader.py", line 327, in check_consistent_history
    raise InconsistentMigrationHistory(
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration aaaa.0024_campaign_template is applied before its dependency bbbb.0005_templatemodel_from_template on database 'default'.

我的解决方案

python manage.py migrate bbbb 

python manage.py migrate

因为我批量更改了Django的应用程序名称,所以当应用到数据库时,应用程序的顺序不一致。aaaa依赖的bbbb没有被首先创建,所以我手动先创建了bbbb。

0

并非为所有应用程序创建迁移文件:
步骤1:

create migration folder and add __init__.py file for all app

步骤2:

delete db.sqlite3 database 

步骤三:

python manage.py migrate
python manage.py makemigrations 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接