多个golang项目中使用的 gorm 版本一直是 github.com/jinzhu/gorm v1.9.15 ,最近在处理数据库操作时又去gorm的官网上看了看官方文档,却发现按照官网文档中的介绍应用后却没有生效。
排查一番后才发现,gorm的版本更新了,现在官网上展示的默认文档是 v2.x 的使用文档,而 v2.x 和之前的 v1.x 相比是 完全的从零开始,某些方法在用法上已经更改了。
这里,列举两个比较明显的改变。
添加索引
通过gorm为指定的字段添加索引,在字段声明中设置索引和唯一索引:
1 | type User struct { |
结果在执行时只看到了一条创建索引的命令输出:
1 | [2021-04-28 10:25:58] [52.98ms] CREATE INDEX name ON `archive_video`(name) |
按照gorm官方文档中的介绍,uniqueIndex 标签的作用与 index 类似,它等效于 index:,unique :
1 | type User struct { |
但在测试后发现,唯一索引 gorm:"uniqueIndex" 似乎不生效。
这就是其中的一个版本变化:
在 gorm v1 中,唯一索引使用
unique_index下划线形式,而在 gorm v2 中,改成了使用camelCase风格的写法。
我使用的是 v1.9.15 版本,所以需要改成 unique_index 才行。
正确的 v1 风格的写法:
1 | type User struct { |
正确的 v2 风格的写法:
1 | type User struct { |
批量插入
gorm v1 中不支持批量插入,v2 中才支持。
v2.x 中直接通过 db.model().create() 即可插入批量数据。一种示例如下:
1 | // 使用事务,批量插入 |
而在 v1.x 中,要想实现批量插入,可以通过执行 原生SQL(db.Exec) 的方法来完成。
mysql实现批量插入的sql语句为:
1 | INSERT INTO `users` VALUES (?,?,?),(?,?,?),(?,?,?); |
所以,只需要将要插入的数据进行一下sql拼接即可。
一种示例如下:
1 | // BatchSave 批量插入数据 |
吐槽一下
在 gorm v2.x 的升级文档中看到下面的说明:
注意 GORM
v2.0.0发布的 git tag 是v1.20.0
我当前使用的 v1.x 的版本是 v1.9.15 。不过看到官方的代码仓库中却找不到这个tag,能看到的只有如下的 v1.9.19 :

而我想要下载这个最高的版本 v1.9.19 ,却发现 go get github.com/jinzhu/gorm@v1.9.19 是找不到的。
一般来说按照惯例,大版本的变化应该定义为 v2.x.x 的tag才比较合适。
不得不说,gorm这个版本定义的还真让人迷糊啊。
另外一个槽点就是文档,我这代码要不报错,光看文档我还真不清楚文档和使用的版本是不一致的。
相关文档
- GORM v1 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
- GORM 2.0 发布说明 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.