升级版本django-mptt后为什么会出现此数据库迁移错误?

时间:2015-07-02 07:03:02

标签: mysql django django-models database-migration django-mptt

我的Django应用程序有一个requirements.txt文件(显示为here),我用它在我的虚拟环境中安装模块。一切正常。

但是,我现在正尝试将django-mptt从0.6.1升级到最新版本。 (我实际上并不关心升级django-mptt。我只是想升级我的Django版本。但它似乎升级了Django,我必须先升级django-mptt,如here所述。所以我做pip install -U django-mptt。这导致django-mptt从0.6.1变为0.7.4,Django从1.7.1变为1.8.2。它还会导致django-cache-machine从origin到master。您可以在下面的屏幕截图中看到更改。

然后我做manage.py runserver然后提示我迁移。所以我这样做。没问题。但是,如果我删除所有表然后再次运行迁移,则在迁移期间出现此错误:

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作为我的数据库这一事实有关?

enter image description here

编辑:此点下面的部分已于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_mymodelmyapp5_mymodel有一个外键约束。但是当它试图创建这个FK时,它会失败,因为外键的目标还不存在!为什么升级后表创建顺序不同?

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。看起来我的一个Django应用程序缺少myapp2缺少一个迁移文件夹。我修好了,事情开始正常。