Gorm 实践(一)| 青训营

82 阅读2分钟

本文只是记录一下我学习过程中的一些理解,欢迎交流讨论。

1. 一条记录

如果只是想要一条记录,那么可以直接使用 .First 来选取一条,如果找不到记录还会报错。

db.First(&user)

但,有一点要注意的是如果结构体包含有主键字段,那么在构建查询的时候会把这个字段加到 Where 里,结果就是会导致你可能根本查不到字段,还会报错。

我当初就是被这个坑了,后来就换成了

db.Limit(1).Find(&user)

虽然写长了点,但是结果是我想要的了

还要注意的是在 .Where() 里的时候如果使用的是 struct 查询,GORM 只会查询非零字段,这意味着您的字段值是否为 0、 false、 ""、 [] 或其他零值,则它们不会用于构建查询条件

在 Golang 1.21 添加了一个 zero 零值的符号,不知道在这里有没有用。

2. 构建复杂查询

还有一处比较有用是构建复杂查询。

可以用 .Where(db.Where().Or(db.Not())).Not() 这样嵌套的方式来构建复杂的查询判断条件。

如果有用 .Group() 的话还可以用 .Having() 来写

3. 多 Select

.Select() 可以直接在内部加选择字段

比如可以 .Select("1","2","3"),或者直接用 .Select([]string{"1", "2", "3"})

也就是用字符数组来做会十分方便

4. err 错误处理

一般我比较喜欢用

if err := db.Find(&user).Error; err != nil{ // 错误处理 }

来处理错误,这样子看起来更优雅一些。但如果是按代码行数来判断工作量的话那还是用原来的吧

5. 随机选取

有让做随机选取会使用 .Take() 但这个其实随机性不是很够,而且不能满足一些特定需求。

可以用算号取 ID 的办法,当然如果没太高要求的话 .Take() 也是可以达到类似的效果的