我正在从Django 1.8升级到1.11。升级0007_auth和0008_auth中包含2次迁移。
由于某些原因,0008正在创建一堆之前不存在的MySQL外键约束,即使在查看迁移时,所有更改的内容都是username
max_length。
以下是在运行迁移时记录的一个表上运行的查询示例
ALTER TABLE `django_admin_log` ADD CONSTRAINT
`django_admin_log_user_id_xxxxxx_fk`
FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`)
从我从1.8文档中可以看到,这些约束应该已经存在于具有用户模型外键的表中,其他表也应该使用外键。但我的数据库根本没有fk
限制。
这是一个问题的原因是因为当我将它部署到生产中时,在一个巨大的表上运行ALTER TABLE
导致数据库被保留(我在取消它之前取消了它,但它是超过10分钟)
知道为什么会这样吗?
如果有办法手动或更有效地做到这一点?我可以把我的网站用于维护,但如果我能做20个简单的手动命令,我真的宁愿避免它。
运行manage.py sqlmigrate auth 0008
输出:
ALTER TABLE `auth_user` MODIFY `username` varchar(150) NOT NULL;
当MySQL使用NOT NULL
执行alter table时,它实际上会复制表。所以我认为正在发生的事情是表被复制,然后更新所有具有外键的表的约束。