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

Mat*_*ngh 21 django django-admin django-manage.py django-migrations

运行时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>
Run Code Online (Sandbox Code Playgroud)

运行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)
Run Code Online (Sandbox Code Playgroud)

我昨天尝试了django-extensions,当我运行一些直接的SQL查询并且使用git重置后,它都搞砸了.我还在学习迁移,所以我不明白什么是错的,因为在我看来这两个迁移都已经应用了.

谢谢您的帮助!

小智 33

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

启动你的数据库外壳

python manage.py dbshell
Run Code Online (Sandbox Code Playgroud)

使用您想要的数据库。如果您不知道,请运行“show databases”

mysql>use <database_name>;
Run Code Online (Sandbox Code Playgroud)

检索您的应用程序下的所有迁移

mysql> select * from django_migrations where app='<app>';
Run Code Online (Sandbox Code Playgroud)

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

mysql> delete from django_migrations where id=361;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最重要的答案。 (7认同)
  • 很好的答案。找到要删除的迁移文件的更简单方法是:从 django_migrations 中删除,其中 name=&lt;the_name_you_show_in_error_X 之前应用过' (3认同)

mas*_*nun 8

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

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

  • 是的,我想到类似的东西.谢谢你的回答.我刚刚通过删除压扁的数据,删除了与压缩数据相关的迁移文件并运行"makemigrations"和"migrate"来修复它.这是我认为应该在django项目中修复的内容. (2认同)

tes*_*t30 5

运行这个 python manage.py dbshell

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

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


小智 5

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

  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引用的模型必须在其app第一次迁移时创建(通常称为0001_initial);否则,您将遇到依赖性问题。

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