因为我的 devel env 跟实际 production env 有太多的不同,所以我实际 deploy 的时候经常会出现一堆奇怪的问题。这边会尝试不定期记录下来我找到的各种暴力解法。
其中最近困扰我的就是这个:
django.db.utils.OperationalError: 3780 Referencing column and referenced column are incompatible
这个主因其实是我 devel 跟 production 的 Django 版本不一样,当然有很多因素让我选择不同步(因为连作业系统都不一样了),而这是一个很常见的 Error.
这个常见的因素是使用 ForeignKey 的时候, primary_key 有的版本或作业系统使用 BigAutoField 而有些使用 AutoField ,而在某些 DB 版本中,这两个会在 create table 时分别实作为 bigint 跟 int,而这个就是产生这个 Error 的主因。
ForeignKey 在实际使用时(假设叫做 xxx),会在 table 内建立一个 xxx_id ,而这个会去参照 ForeignKey 参照的 model 的 primary_key 。而如果两边的 Django 版本不同的话就很容易 raise 3780 出来。
解法其实很简单,首先找出出错的 migrations ,执行
python3 manage.py sqlmigrate <APP Name> <migration>
这个时候会出现一堆 SQL 指令,然後再执行
python3 manage.py dbshell
开始执行 sqlmigrate 得到的指令看是哪一行出错,找出出错的一行去 alter 成正确的就行了。
例如说假如 xxx 的 id 是 int auto_increment not null ,但是 ForeignKey 产生出来的 xxx_id 却是 bigint default null 的时候,那就执行:
alter table <table_name> modify column xxx_id int Default NULL;
就可以了。
然後如果出错的栏位後面还有其他 SQL commands 记得执行完。
最後因为其实已经在 database level 执行完了,所以可以直接把这个有问题的 migration fake 掉。
python3 manage.py sqlmigrate <APP Name> <migration> --fake
好了,暴力解完。虽然没有解决根本问题但是至少可以不用被这个问题挡住开发。
>>: [Day??] 2021 iThome 铁人赛 - 颁奖典礼 @ 2022.01.08‧辅仁大学
虽然昨天已经介绍了如何在你的网页中实作 Color System,但严格上来说今天才算是这系列第一...
前言 看群里和laravel社群有些人对docker不太会使用,在这里我推荐使用laradock来部...
这边的功能是为了想呈现网页中作品集这个项目 但是在作品集中又分了很多品项 像是平面、网页、插画等等....
题组回顾与观念统整 Stack 和 Queue 绝对是资料结构中不可以错过的一种容器,不只用於资料...
这是我一边学习一边写下的笔记,如果内容有错,恳请在下方留言跟我说,我会非常感谢的!!! 变数 「变数...