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

Django manage.py: Migration applied before its dependency

当运行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>

运行 showmigrations returns:

<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 重新设置。我还在学习迁移,所以我不明白哪里出了问题,因为在我看来这两个迁移都已经应用了。

感谢您的帮助!

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

我个人不知道是否有任何方法可以自动修复此问题。您需要自己解决问题。如果您有版本控制,请恢复这些更改并尝试重新考虑您应该如何在不影响旧版本的情况下压缩迁移。

运行这个python manage.py dbshell

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

你应该没事的。如果你的迁移对数据库有很大的改变,那么修复它恐怕不会那么容易。

  1. 编辑冲突迁移的依赖项,使其不再引用已应用的迁移。
  2. 然后运行pythonmanage.py再次迁移,应该是固定的。

    • 警告:这仅在假设数据库状态与您应用冲突迁移后获得的状态相匹配的情况下有效。

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

启动你的数据库shell

python manage.py dbshell

使用你想要的数据库。如果你不知道,运行 "show databases"

mysql>use <database_name>;

检索您应用下的所有迁移

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

您将在所有迁移旁边看到带有 id 的输出。查看您要删除的迁移。假设id是361

mysql> delete from django_migrations where id=361;

你需要伪造迁移并再次迁移 只需确保您有数据备份,因为当您再次迁移时,您需要删除应用 table。 确保您查看显示迁移并按顺序迁移未迁移的应用程序

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

python manage.py makemigrations <my-app>

并且:

python manage.py migrate

导出您的相关表格(如果有)。

  • 删除所有迁移文件夹
  • 删除数据库(sqlite3)

然后 运行 makemigrationsmigrate 命令

  1. 删除迁移文件。

  2. 运行:

    python manage.py migrate
    python manage.py makemigrations 
    python manage.py migrate
    python manage.pyrunserver
    

我通过以下步骤(自定义用户模型)解决了这个问题:

  1. 删除此文件: migrations[=45=]01_initial.py

  2. 删除这个: db.sqlite3

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

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

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


我用过这个link它帮我解决了依赖问题:

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

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

此外,当 运行 迁移时,您可能 运行 陷入 CircularDependencyError,因为 Django 将无法自动打破依赖循环,因为动态依赖。如果您看到此错误,您应该通过将用户模型所依赖的模型移动到第二次迁移来打破循环。 (您可以尝试制作两个彼此具有 ForeignKey 的普通模型,如果您想了解它通常是如何完成的,请查看 makemigrations 如何解决循环依赖。)