-
Notifications
You must be signed in to change notification settings - Fork 45
4.查询
afumu edited this page Jun 6, 2023
·
2 revisions
user, resultDb := gplus.SelectById[User](1)
fmt.Println(resultDb.Error)
fmt.Println(user)
// SELECT * FROM `users` WHERE id = 1 ORDER BY `users`.`id` LIMIT 1
user, resultDb := gplus.SelectById[User](999)
fmt.Println(resultDb.Error)
fmt.Println(user)
// record not found
// &{0 0 0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC}
如果查询不到记录,resultDb.Error 将返回 record not found
可以使用下面这种方式检查ErrRecordNotFound错误
// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)
users, resultDb := gplus.SelectByIds[User]([]int{1, 2, 3})
fmt.Println(resultDb.Error)
for _, user := range users {
fmt.Println(user)
}
query, u := gplus.NewQuery[User]()
query.Eq(&u.Username, "张三")
user, resultDb := gplus.SelectOne(query)
fmt.Println(resultDb.Error)
fmt.Println(user)
这里首次使用到query 条件对象,在Gorm-Plus中所有的查询条件都可以使用query对象来构建。
query, u := gplus.NewQuery[User]()
query.Eq(&u.Username, "张四")
user, resultDb := gplus.SelectOne(query)
fmt.Println(resultDb.Error)
fmt.Println(user)
// record not found
// &{0 0 0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC}
如果查询不到记录,resultDb.Error 将返回 record not found
users, resultDb := gplus.SelectList[User](nil)
fmt.Println(resultDb.Error)
for _, user := range users {
fmt.Println(user)
}
query, u := gplus.NewQuery[User]()
query.Ge(&u.Age, 18)
users, resultDb := gplus.SelectList(query)
fmt.Println(resultDb.Error)
for _, user := range users {
fmt.Println(user)
}
注意:NewQuery 函数加了泛型之后,后续的查询方法就可以省略泛型了,Go编译器能自动推断出需要的泛型类型。
query, u := gplus.NewQuery[User]()
query.Ge(&u.Age, 18)
count, resultDb := gplus.SelectCount(query)
fmt.Println(resultDb.Error)
fmt.Println(count)
query, u := gplus.NewQuery[User]()
page := gplus.NewPage[User](1, 2)
query.Ge(&u.Age, 18)
page, resultDb := gplus.SelectPage(page, query)
fmt.Println(resultDb.Error)
fmt.Println(page.Total)
for _, user := range page.Records {
fmt.Println(user)
}
query, u := gplus.NewQuery[User]()
query.Ge(&u.Age, 18)
exists, resultDb := gplus.Exists(query)
fmt.Println(resultDb.Error)
fmt.Println(exists)
- 返回自定义结构体
query, u := gplus.NewQuery[User]()
query.Eq(&u.Username, "张三")
type UserVo struct {
Username string
Password string
}
userVo, resultDb := gplus.SelectGeneric[User, UserVo](query)
fmt.Println(resultDb.Error)
fmt.Println(userVo)
注意:这里 SelectGeneric 传入的第二个泛型返回的是非指针类型,如果需要返回指针类型需要使用 *User,例如:
query, u := gplus.NewQuery[User]()
query.Eq(&u.Username, "张三")
type UserVo struct {
Username string
Password string
}
userVo, resultDb := gplus.SelectGeneric[User, *UserVo](query)
fmt.Println(resultDb.Error)
fmt.Println(userVo)
如果想要起别名,可以使用 gplus.As 函数
query, u := gplus.NewQuery[User]()
type UserVo struct {
Name string
Password string
}
uvo := gplus.GetModel[UserVo]()
query.Eq(&u.Username, "张三").Select(gplus.As(&u.Username, &uvo.Name), &u.Password)
userVo, resultDb := gplus.SelectGeneric[User, UserVo](query)
fmt.Println(resultDb.Error)
fmt.Println(userVo)
- 返回map
query, u := gplus.NewQuery[User]()
query.Eq(&u.Username, "张三").Select(&u.Username, &u.Password)
userMap, resultDb := gplus.SelectGeneric[User, map[string]any](query)
fmt.Println(resultDb.Error)
fmt.Println(userMap)
- 返回基础类型
query, u := gplus.NewQuery[User]()
query.Select(gplus.Sum(&u.Age))
total, resultDb := gplus.SelectGeneric[User, int](query)
fmt.Println(resultDb.Error)
fmt.Println(total)
- 返回自定义结构体列表
query, u := gplus.NewQuery[User]()
query.Ge(&u.Age, 18)
type UserVo struct {
Username string
Password string
}
userVos, resultDb := gplus.SelectGeneric[User, []UserVo](query)
fmt.Println(resultDb.Error)
for _, userVo := range userVos {
fmt.Println(userVo)
}
- 返回map列表
query, u := gplus.NewQuery[User]()
query.Select(&u.Dept, gplus.Sum(&u.Score).As("score")).Group(&u.Dept)
deptMaps, resultDb := gplus.SelectGeneric[User, []map[string]any](query)
fmt.Println(resultDb.Error)
for _, deptMap := range deptMaps {
fmt.Println(deptMap)
}
- 返回基础类型列表
query, u := gplus.NewQuery[User]()
query.Select(&u.Age).Distinct(&u.Age)
allAges, resultDb := gplus.SelectGeneric[User, []int](query)
fmt.Println(resultDb.Error)
for _, age := range allAges {
fmt.Println(age)
}
- 返回自定义结构体分页列表
type UserVo struct {
ID int64
Username string
Password string
}
query, u := gplus.NewQuery[User]()
page := gplus.NewPage[UserVo](1, 10)
query.Ge(&u.Age, 18)
page, resultDb := gplus.SelectPageGeneric[User, UserVo](page, query)
fmt.Println(resultDb.Error)
fmt.Println(page.Total)
for _, userVo := range page.Records {
fmt.Println(userVo)
}
- 返回map分页列表
query, u := gplus.NewQuery[User]()
page := gplus.NewPage[map[string]any](1, 10)
query.Ge(&u.Age, 18)
page, resultDb := gplus.SelectPageGeneric[User, map[string]any](page, query)
fmt.Println(resultDb.Error)
fmt.Println(page.Total)
for _, userMap := range page.RecordsMap {
fmt.Println(userMap)
}
注意:返回是map类型数据的话,将会把数据存储到 RecordsMap 中,而不是 Records。
- 返回基础类型分页列表
query, u := gplus.NewQuery[User]()
query.Select(&u.Age).Distinct(&u.Age)
page := gplus.NewPage[int64](1, 5)
page, resultDb := gplus.SelectPageGeneric[User, int64](page, query)
fmt.Println(resultDb.Error)
fmt.Println(page.Total)
for _, age := range page.Records {
fmt.Println(*age)
}
注意:返回是基础类型的话,Records 存储的是指针类型,需要通过 * 取值。