1 gorm 用First方法查询一条记录,如果记录不存在,则会返回 gorm.ErrRecordNotFound错误,所以在代码中需要根据 err 是否等于 gorm.ErrRecordNotFound 判断是否查询为空,或者是其他的错误。
2 gorm中如果使用 db.Save(&user)这种方式更新,结构体中的零值不会更新,更正方法如下:
- 用 Updates 来更新多列,参数类型为 map[string]any 来解决这个问题。
3 grom实例化mysql实例的DSN最后加上 字符集和loc配置,比如像下面这样:
[user]:[password]@tcp([addr]:[port])/[dbname]?charset=utf8&parseTime=true&loc=Local
4 gorm Model对象结构体的 gorm tag 使用
type Card struct {
ID int64 `gorm:"primary_key" json:"id"`
Sid int64 `json:"sid"`
PhysicsNo string `json:"physics_no"`
Type uint8 `json:"type"`
Status uint8 `json:"status"`
AddTime int64 `json:"add_time"`
}
struct tag 格式比较特殊,必须是key:value格式,冒号之间不能有空格,多个 key:value 之间用空格分割,比如你设置了gorm,json,grpc。 本质上struct tag就是一个string。只是在反射处理中做了一层解析而已。
5 gorm 版本问题
gorm 旧版本是 github.com/jinzhu/gorm v1.x.x ,新版则是:github.com/go-gorm/gorm v1.23.6
新版与旧版不兼容,这点非常坑。自己要注意,能用新版一定不要用旧版,都不维护了。新版也解决了旧版的很多设计缺陷。
go生态里数据库orm能打的也就gorm这一个,sqlx只是对原生的sql的微增强,开发也来还是略显麻烦。sql builder 库很多,但也不是非常好用。