Skip to content

Commit 370f02b

Browse files
committed
add gorm find and first api
Signed-off-by: yuluo-yx <yuluo08290126@gmail.com>
1 parent 34ff9ab commit 370f02b

File tree

1 file changed

+99
-0
lines changed
  • project/gorm/err_record_not_found

1 file changed

+99
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"log"
7+
8+
pkggorm "gorm.io/gorm"
9+
"gorm.io/gorm/logger"
10+
11+
"github.com/deigmata-paideias/fucking-go/gorm"
12+
)
13+
14+
// Gorm 在什么情况下会返回 ErrRecordNotFound 错误?
15+
// 在之前的 Gorm 固有印象中,凡是没有找到 record 的,都会返回 ErrRecordNotFound
16+
17+
var db *pkggorm.DB
18+
19+
func init() {
20+
21+
_db := gorm.Init("./err_record_not_found/gorm.db", []any{&User{}}, &pkggorm.Config{
22+
Logger: logger.Default.LogMode(logger.Info),
23+
})
24+
25+
if _db == nil {
26+
log.Fatal("Init db failed!")
27+
}
28+
29+
db = _db
30+
}
31+
32+
type User struct {
33+
ID uint
34+
Name string
35+
Age int8
36+
}
37+
38+
func main() {
39+
40+
// First 方法查询
41+
firstResUser := &User{}
42+
firstResUserSlice := make([]User, 0)
43+
err1 := db.Model(firstResUser).Where("id = ?", 1).First(firstResUser).Error
44+
if errors.Is(err1, pkggorm.ErrRecordNotFound) {
45+
log.Println("First 方法使用结构体接受返回值,没有找到记录,返回了 ErrRecordNotFound 错误")
46+
} else {
47+
log.Println("First 方法使用结构体接受返回值,没有找到记录,返回了其他错误或未返回错误 ")
48+
log.Printf("Err: %v\n", err1.Error())
49+
}
50+
fmt.Printf("\n%+v\n", firstResUser)
51+
52+
err2 := db.Model(firstResUser).Where("id = ?", 1).First(&firstResUserSlice).Error
53+
if errors.Is(err2, pkggorm.ErrRecordNotFound) {
54+
log.Println("First 方法使用 Slice 接受返回值,没有找到记录,返回了 ErrRecordNotFound 错误")
55+
} else {
56+
log.Println("First 方法使用结构体接受返回值,没有找到记录,返回了其他错误或未返回错误 ")
57+
log.Printf("Err: %v\t, res slice len: %v", err2, len(firstResUserSlice))
58+
}
59+
fmt.Printf("\n%+v\n", firstResUserSlice)
60+
61+
fmt.Println("====================================")
62+
63+
// Find 方法查询
64+
findResUser := &User{}
65+
findResUserSlice := make([]User, 0)
66+
err3 := db.Model(findResUser).Where("id = ?", 1).Find(findResUser).Error
67+
if errors.Is(err3, pkggorm.ErrRecordNotFound) {
68+
log.Println("Find 方法使用结构体接受返回值,没有找到记录,返回了 ErrRecordNotFound 错误")
69+
} else {
70+
log.Println("Find 方法使用结构体接受返回值,没有找到记录,返回了其他错误或未返回错误 ")
71+
log.Printf("Err: %v\n", err3)
72+
}
73+
fmt.Printf("\n%+v\n", firstResUser)
74+
75+
err4 := db.Model(findResUser).Where("id = ?", 1).Find(&findResUserSlice).Error
76+
if errors.Is(err4, pkggorm.ErrRecordNotFound) {
77+
log.Println("Find 方法使用 Slice 接受返回值,没有找到记录,返回了 ErrRecordNotFound 错误")
78+
} else {
79+
log.Println("Find 方法使用结构体接受返回值,没有找到记录,返回了其他错误或未返回错误 ")
80+
log.Printf("Err: %v, \t res slice len: %v", err4, len(findResUserSlice))
81+
}
82+
fmt.Printf("\n%+v\n", findResUserSlice)
83+
84+
// 2026/02/18 23:08:52 First 方法使用结构体接受返回值,没有找到记录,返回了 ErrRecordNotFound 错误
85+
// 2026/02/18 23:08:52 First 方法使用 Slice 接受返回值,没有找到记录,返回了 ErrRecordNotFound 错误
86+
//
87+
// 2026/02/18 23:08:52 Find 方法使用结构体接受返回值,没有找到记录,返回了其他错误或未返回错误
88+
// 2026/02/18 23:08:52 Err: <nil>
89+
// 2026/02/18 23:08:52 Find 方法使用结构体接受返回值,没有找到记录,返回了其他错误或未返回错误
90+
// 2026/02/18 23:08:52 Err: <nil>, res slice len: 0
91+
//
92+
// 运行上述代码,我们会发现,在使用 Find 方法查询数据时,不论使用 Struct 或者 Slice 接受返回值,
93+
// Gorm 都不会返回 ErrRecordNotFound 错误,而是直接返回 nil,
94+
// 并且将查询结果赋值为 Struct 的零值或者 Slice 的空切片。
95+
// 这说明,Gorm 只有在使用 First 方法查询数据时,如果没有找到记录,
96+
// 才会返回 ErrRecordNotFound 错误。而在使用 Find 方法查询数据时,即使没有找到记录,
97+
// 也不会返回 ErrRecordNotFound 错误,而是直接返回 nil
98+
99+
}

0 commit comments

Comments
 (0)