1. 哔了狗的 gorm. 很久没用 golang 了,生态这么操蛋么?
最近用 golang 的一个项目,天生集成了 gorm 我无从选择。
有一个需求,嗯,很简单,MYSQL 用一个外键。
为什么要用外键?因为他的 orm ,据我初步看文档了解,如果不建立外键对应关系,是不能做 join 的。不让 join 基本 crud 都玩不转啊
我看了文档,我不是没有英文阅读能力,为了省事,我看中文比较快,嗯,语法很简单
https://gorm.io/zh_CN/docs/index.html
数据库创建外键很简单

嗯,我照着做了,不生效
没准是哪个傻逼翻译中文时候翻译错了
看英文官方文档,嗯,翻译没错,不生效
我直接按照文档做了个示例,不生效
看来这玩意 BUG 了
我看看我的版本吧,看了下项目引用

1.22.5
上官方网站

显示最新 1.23.6
那就找找 changelog ,看看 1.22.5 到 1.23.6 有什么升级。是不是修复了这个 BUG
嗯嗯,我傻逼了,找了一个小时没找到
所有关于 changelog what's new 的,都指向一个吹牛逼 gorm v2 有啥新特性的地方
github 呢,没有 release ,只有版本库的 tag ,也没有任何说明
因为还有其他地方用着这个版本,竟然前人大佬写死了 1.22.5 ,暂时不敢升级
找官方手册,找来找去没找到。找 stackoverflow 之类,找到了一个非官方解决方案
用这个方案的关键字去搜索,哇,找到了一个 2018 年的 github issue
这个大佬真贴心,原来 2018 年建外键的功能就不好使啊,而且 MYSQL POSTGRES SQLITE 都不好使,你敢信,他官方好像就主要支持这三种数据库!

请允许我引用一下
You can use gorm:"foreignkey:", but it doesn't create any foreign key, not like primary_key, that's quite counter-intuitive.
You need use gorm:"type:int REFERENCES user(id) ON DELETE CASCADE" for PostgteSQL#450.
You need use db.Model(Email{}).AddForeignKey("user_id", "user(id)", "CASCADE", "CASCADE") for MySQL, because above tag doesn't work in MySQL.
You need use gorm:"type:int REFERENCES user(id) ON DELETE CASCADE" + db.Exec("PRAGMA foreign_keys = ON") for SQLite because AddForeignKey() doesn't work for SQLite and 'foreign_keys = off' is default setting in SQLite#390.
None of above things are mentioned in document.
I am still confusing what's the usage of tag gorm:"foreignkey:XXX", it doesn't create any foreign key or contribute cascade delete/insert/update/retrieve.
2018 年 6 月,现在是 2022 年 6 月,这可真是高效,还没修复
好在这个大佬给了一个方式,也就是我之前在 stackoverflow 搜索到的
You need use db.Model(Email{}).AddForeignKey("user_id", "user(id)", "CASCADE", "CASCADE") for MySQL
然后我惊奇的发现,GORM 官方把 AddForeignKey()删除了
因为没有 changelog ,我也不知道他啥时候删除的
这可真是高效 艹
