为啥升级我的版本 django-mptt 后出现此数据库迁移错误?

Posted

技术标签:

【中文标题】为啥升级我的版本 django-mptt 后出现此数据库迁移错误?【英文标题】:Why this database migration error after I upgrade my version django-mptt?为什么升级我的版本 django-mptt 后出现此数据库迁移错误? 【发布时间】:2015-09-19 13:47:08 【问题描述】:

我的 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 从源到主。您可以在下面的屏幕截图中看到更改。

然后当我执行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 作为我的数据库这一事实有关吗?

编辑:这一点以下的部分是在 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 时,它失败了,因为外键的目标还不存在!为什么升级后建表顺序不一样?

【问题讨论】:

升级Django是否涉及升级MySQL?如果是这样,它是如何做到的? 没有。升级 python 包不会改变底层的 MARIADB 数据库。 mydb_instance 属于你吗?还是给 Django? 升级后您创建了哪些迁移,django 尝试应用什么 SQL 来创建新表? 当时应用的迁移的SQL呢?或者,如果失败了,当您现在尝试重新创建表时,它尝试应用的 SQL 是什么? sqlmigrate 命令应该会给你这个信息。 【参考方案1】:

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

【讨论】:

以上是关于为啥升级我的版本 django-mptt 后出现此数据库迁移错误?的主要内容,如果未能解决你的问题,请参考以下文章

django-mptt 过滤而不破坏树

为啥升级win10后,很多软件打开就显示文件系统错误(-1073741819)

为啥我的jdk老提示更新啊

连接不可用 - Lion OSX 升级后出现 Xcode 错误

我的手机wifi连接后为啥会自动断开

为啥我下载的软件老是闪退啊?