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

时间:2016-08-17 12:24:37

标签: django django-admin django-migrations django-manage.py

运行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返回:

<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重置后,它都搞砸了。我还在学习迁移,所以我不明白什么是错的,因为在我看来这两个迁移都已经应用了。

感谢您的帮助!

9 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:0)

运行此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 :(得分:0)

  1. 编辑有冲突的迁移的依赖性,以使其不再引用已应用的迁移。
  2. 然后再次运行python manage.py进行迁移,应该将其修复。

    • 警告:仅在数据库状态与您应用冲突迁移后获得的状态相匹配的情况下才起作用。

答案 3 :(得分:0)

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

启动数据库外壳程序

public static void main(String[] args) throws IOException {
    createFileDude();
}

public static void createFileDude() throws IOException {
    File file = new File("C:\\Users\\User\\Desktop\\Test.txt");
    try {
        System.out.println("Create file>> " + file.createNewFile());
    } catch (IOException e) {
        e.printStackTrace();
        throw e;
    }
}

使用所需的数据库。如果您不知道,请运行“显示数据库”

python manage.py dbshell

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

mysql>use <database_name>;

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

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

答案 4 :(得分:0)

您需要伪造迁移并再次迁移 只需确保您已从数据中备份,因为再次迁移时,您需要删除apps表。 确保您查看节目迁移并按其顺序迁移未迁移的应用

答案 5 :(得分:0)

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

python manage.py makemigrations <my-app>

并且:

python manage.py migrate

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

答案 6 :(得分:0)

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

然后运行makemigrationsmigrate命令

答案 7 :(得分:0)

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

  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);否则,您将遇到依赖性问题。

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

答案 8 :(得分:-4)

  1. 删除迁移文件。

  2. 运行:

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