[Django] 解决 django.db.utils.OperationalError: 3780

因为我的 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‧辅仁大学

Day 09 - Design System x 实作 — Typography

虽然昨天已经介绍了如何在你的网页中实作 Color System,但严格上来说今天才算是这系列第一...

〖按图施工保证完工〗Linux CentOS 7 建置 Laradock

前言 看群里和laravel社群有些人对docker不太会使用,在这里我推荐使用laradock来部...

React-使用JSON增加品项

这边的功能是为了想呈现网页中作品集这个项目 但是在作品集中又分了很多品项 像是平面、网页、插画等等....

资料存取的先後顺序:Stack 和 Queue

题组回顾与观念统整 Stack 和 Queue 绝对是资料结构中不可以错过的一种容器,不只用於资料...

C#学习笔记2:变数、变数宣告与命名规则

这是我一边学习一边写下的笔记,如果内容有错,恳请在下方留言跟我说,我会非常感谢的!!! 变数 「变数...