多个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.