本文只是记录一下我学习过程中的一些理解,欢迎交流讨论。
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() 也是可以达到类似的效果的