为什么在我升级我的版本 django-mptt 后这个数据库迁移错误?
Why this database migration error after I upgrade my version django-mptt?
我的 Django 应用程序有一个 requirements.txt 文件(显示 here),我用它在我的虚拟环境中安装模块。一切正常。
不过,我现在正在尝试将 django-mptt 从 0.6.1 升级到最新版本。 (我其实并不关心升级django-mptt,我只是想升级我的Django版本。但是好像要升级Django,我必须先升级django-mptt,如所述)。所以我 pip install -U django-mptt
。这导致 django-mptt 从 0.6.1 到 0.7.4,Django 从 1.7.1 到 1.8.2。它还会导致 django-cache-machine 从源到主。您可以在下面的屏幕截图中看到更改。
然后当我这样做时 manage.py runserver
它会提示我迁移。所以我这样做了。没问题。但是随后,如果我删除所有 table,然后再次迁移 运行,我会在迁移过程中收到此错误:
django.db.utils.OperationalError:
(1005, 'Can\'t create table `mydb_instance`.`#sql-21b_1e`
(errno: 150 "Foreign key constraint is incorrectly formed")')
完整的堆栈跟踪是 here。
这是什么错误?这是否与我使用 MariaDB(服务器版本:10.0.15-MariaDB Homebrew)而不是 MySQL 作为我的数据库有关?
编辑:此点以下的部分添加于 2015 年 7 月 6 日 5:28 UTC
我在上面提到,升级后,系统提示我进行迁移。奇怪的是,即使升级 MPTT 不会导致创建任何新的迁移文件,也会发生这种情况!当我执行 manage.py runserver
时,我收到以下警告消息。为什么?没有意义:
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
编辑:此点以下的部分添加于 2015 年 7 月 6 日 17:00 UTC
作为实验,我将底层数据库从 MariaDB 切换到 MySQL(服务器版本:5.6.25)。问题仍然存在。我得到的错误是 Cannot add foreign key constraint
。完整的堆栈跟踪是 here.
编辑:此点以下的部分添加于 2015 年 7 月 6 日 17:05 UTC
查看我 5 分钟前发布的堆栈跟踪,我发现错误是由以下 SQL 语句触发的:
ALTER TABLE `myapp2_mymodel2` ADD CONSTRAINT `mymod_mymodel5_id_335ee73cecd6ecbf_fk_myapp5_mymodel5_id` FOREIGN KEY (`mymodel5_id`) REFERENCES `myapp5_mymodel5`;
我明白问题出在哪里了。 myapp2_mymodel
有一个指向 myapp5_mymodel
的外键约束。然而,当它试图创建这个 FK 时,它失败了,因为外键的目标还不存在!为什么升级后table的创建顺序不一样?
我自己解决了这个问题。看起来我的 Django 应用程序之一缺少 myapp2 缺少迁移文件夹。我修复了它,一切开始正常工作。
我的 Django 应用程序有一个 requirements.txt 文件(显示 here),我用它在我的虚拟环境中安装模块。一切正常。
不过,我现在正在尝试将 django-mptt 从 0.6.1 升级到最新版本。 (我其实并不关心升级django-mptt,我只是想升级我的Django版本。但是好像要升级Django,我必须先升级django-mptt,如pip install -U django-mptt
。这导致 django-mptt 从 0.6.1 到 0.7.4,Django 从 1.7.1 到 1.8.2。它还会导致 django-cache-machine 从源到主。您可以在下面的屏幕截图中看到更改。
然后当我这样做时 manage.py runserver
它会提示我迁移。所以我这样做了。没问题。但是随后,如果我删除所有 table,然后再次迁移 运行,我会在迁移过程中收到此错误:
django.db.utils.OperationalError:
(1005, 'Can\'t create table `mydb_instance`.`#sql-21b_1e`
(errno: 150 "Foreign key constraint is incorrectly formed")')
完整的堆栈跟踪是 here。
这是什么错误?这是否与我使用 MariaDB(服务器版本:10.0.15-MariaDB Homebrew)而不是 MySQL 作为我的数据库有关?
编辑:此点以下的部分添加于 2015 年 7 月 6 日 5:28 UTC
我在上面提到,升级后,系统提示我进行迁移。奇怪的是,即使升级 MPTT 不会导致创建任何新的迁移文件,也会发生这种情况!当我执行 manage.py runserver
时,我收到以下警告消息。为什么?没有意义:
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
编辑:此点以下的部分添加于 2015 年 7 月 6 日 17:00 UTC
作为实验,我将底层数据库从 MariaDB 切换到 MySQL(服务器版本:5.6.25)。问题仍然存在。我得到的错误是 Cannot add foreign key constraint
。完整的堆栈跟踪是 here.
编辑:此点以下的部分添加于 2015 年 7 月 6 日 17:05 UTC
查看我 5 分钟前发布的堆栈跟踪,我发现错误是由以下 SQL 语句触发的:
ALTER TABLE `myapp2_mymodel2` ADD CONSTRAINT `mymod_mymodel5_id_335ee73cecd6ecbf_fk_myapp5_mymodel5_id` FOREIGN KEY (`mymodel5_id`) REFERENCES `myapp5_mymodel5`;
我明白问题出在哪里了。 myapp2_mymodel
有一个指向 myapp5_mymodel
的外键约束。然而,当它试图创建这个 FK 时,它失败了,因为外键的目标还不存在!为什么升级后table的创建顺序不一样?
我自己解决了这个问题。看起来我的 Django 应用程序之一缺少 myapp2 缺少迁移文件夹。我修复了它,一切开始正常工作。