Where查询
直接写条件
var user UserModel
DB.Where("id = 5").Take(&user)
fmt.Println(user)
user = UserModel{}
DB.Where("id = 5 or age = 11").Take(&user)
fmt.Println(user)
注意where的顺序,再&函数的前面
结构体条件
- 非空字段查询
var user = UserModel{ID: 5, Name: "李四"}
DB.Debug().Where(user).Take(&user)
// SELECT * FROM `user_models` WHERE (`user_models`.`id` = 5 AND `user_models`.`name` = '李四') AND `user_models`.`id` = 5IMIT 1
fmt.Println(user)
take、first、last只会查主键
Map条件
- 可以查空字段
var user UserModel
DB.Debug().Where(map[string]any{
"age": 0,
}).Take(&user)
// SELECT * FROM `user_models` WHERE `age` = 0 LIMIT 1
fmt.Println(user)
嵌套where条件
query := DB.Where("age = ? and name = ?", 11, "王五1")
var user UserModel
DB.Debug().Where(query).Take(&user)
// SELECT * FROM `user_models` WHERE (age = 11 and name = '王五1') LIMIT 1
fmt.Println(user)
Or
或查询
var user UserModel
DB.Debug().Or("name = ?", "王五").Or("age = 12").Take(&user)
// SELECT * FROM `user_models` WHERE (name = '王五' OR age = 12) LIMIT 1
fmt.Println(user)
Not
非查询
var user UserModel
DB.Debug().Not("age = 12").Take(&user)
// SELECT * FROM `user_models` WHERE NOT age = 12 LIMIT 1
fmt.Println(user)
排序
var userList []UserModel
// 降序
DB.Order("age desc").Find(&userList)
fmt.Println(userList)
// 升序
DB.Order("age asc").Find(&userList)
fmt.Println(userList)
Scan
只需要特定字段
var nameList []string
DB.Model(UserModel{}).Select("name").Scan(&nameList)
fmt.Println(nameList)
或者可以直接使用Pluck
var nameList []string
DB.Model(UserModel{}).Pluck("name", &nameList)
fmt.Println(nameList)
可以新建一个字段比较少的结构体
type User struct {
Name string
ID int64
}
var users []User
DB.Model(UserModel{}).Scan(&users)
fmt.Println(users)
// 字段如果不对应
type Options struct {
Label string `gorm:"column:name"`
Value int64 `gorm:"column:id"`
}
var options []Options
DB.Model(UserModel{}).Scan(&options)
fmt.Println(options)
分组之后,需要特定字段的数据
type User struct {
Age int
Count int
}
var us []User
DB.Model(UserModel{}).Group("age").Select("age, count(*) as count").Scan(&us)
fmt.Println(us)
去重
var nameList []string
DB.Model(UserModel{}).Distinct("name").Select("name").Scan(&nameList)
fmt.Println(nameList)
分页查询
var users []UserModel
// 第一页
DB.Limit(10).Offset(0).Find(&users)
fmt.Println(users)
// 第二页
DB.Limit(10).Offset(10).Find(&users)
fmt.Println(users)
// 第三页
DB.Limit(10).Offset(20).Find(&users)
fmt.Println(users)
// 第n页
Scope
很多时候,我们会经常使用重复的查询方法
那么就可以把这些可能被复用的方法抽离出来
func Age18(tx *gorm.DB) *gorm.DB {
return tx.Where("age >= ?", 18)
}
var users []UserModel
DB.Scopes(Age18).Find(&users)
fmt.Println(users)
还可以使用高阶函数的特点,实现带参数的scope
func NameIn(nameList ...string) func(tx *gorm.DB) *gorm.DB {
return func(tx *gorm.DB) *gorm.DB {
return tx.Where("name in ?", nameList)
}
}
var users []UserModel
DB.Scopes(NameIn("王五", "李四")).Find(&users)
fmt.Println(users)
查询钩子
func (u *UserModel) AfterFind(tx *gorm.DB) (err error) {
fmt.Println("查询钩子")
return
}
原生SQL
使用Row来进行查询操作
var users []UserModel
DB.Raw("select * from user_models where name = ?", "王五").Scan(&users)
fmt.Println(users)
使用Exec来操作数据
DB.Exec("update user_models set name = ? where id = ?", "张三", 4)