这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
表的查询
u1 := model.User{}
r := db.First(&u1)
fmt.Println(u1.ID)
fmt.Println(r.Error)
fmt.Println(r.RowsAffected) //输出r的影响行数
b := errors.Is(r.Error, gorm.ErrRecordNotFound) //输出r的报错是否属于gorm.ErrRecordNotFound
- 使用take查询
u2 := model.User{}
db.Take(&u2)
fmt.Println(u2.ID)
- 根据主键值查询
u3 := model.User{}
r2 := db.First(&u3, 7) //order by primary key
fmt.Println(u3.Name)
fmt.Println(r2)
- 坑:给多个主键值查询
u3 := model.User{}
r2 := db.First(&u3, 7, 8, 9) //坑,只查第一个并输出,若没有结果,则从前往后查,先查到那个就输出
fmt.Println(u3.Name)
fmt.Println(r2) //输出地址
- Find查询
var users []model.User
r3:=db.Find(&users,[]int{7,8,9})
for _,user:=range users{
fmt.Println(user.Name)
}
- 主键错写为字符串,仍可查询
u3 := model.User{}
r2 := db.First(&u3, "7") //但不采用
//r2 := db.First(&u3, "golang")//可运行,但会报错,与主键的Int类型不匹配,且此种情况不属于gorm.ErrRecordNotFound
fmt.Println(u3.Name)
fmt.Println(r2)
条件查询
- 第一种,使用Where("name=?","小红"),其中的 ? 对应了Key的值
u1 := model.User{}
db.Where("name=?", "小红").First(&u1)
fmt.Println(u1.ID)
- 第二种,使用Struct条件查询,同时用Struct查询时,GORM只能查询 非零值/字段 的结果
u2 := model.User{}
db.Where(model.User{Name: "小红"}).First(&u2) //不能查0值
fmt.Println(u2.ID)
- 第三种,Where().Find,即string条件查询,其中关键词/符号包括各种比较 IN LIKE AND BETWEEN Time
var users []model.User
db.Where("name <> ?", "小红").Find(&users)
for _, item := range users {
fmt.Println(item.ID)
}
关键词IN的用法如下:
db.Where("name IN ?", []string{"jinzhu", "jinzhu 2"}).Find(&users)
关键词LIKE的用法如下:
db.Where("name LIKE ?", "%jin%").Find(&users)
而BETWEEN和Time的关键词用法如下:
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
- 第四种,使用Map条件查询
var userList []model.User
db.Where(map[string]interface{}{"name": "小红"}).Find(&userList)
for _, item := range userList {
fmt.Println(item.ID)
}
var userList2 []model.User
db.Where(map[string]interface{}{ //能查0值
"name": "小红",
"age": 0,
}).Find(&userList2)
for _, item := range userList2 {
fmt.Println(item.ID)
}
更新的更多操作方式
- 更改表中所有符合where条件的数据
db.Model(&model.User{}).Where("name=?", "小红").Update("age", 18)
- 参数为键和值,即定义此行的该键为这个值
db.Model(&u1).Update("email", "cke@qq.com")
- 限定在u2对应的行更改
db.Model(&u2).Where("name=?", "小张").Update("age", 18) 此时u2的对应行数nameID要与where相同,否则不更新
真假删除
- 这种删除,只更新deletedat
db.Delete(&user) //删除user对应ID行
db.Where("age = ?", 20).Delete(&User{}) //批量删除
- 查询时会忽略被软删除的内容,但还可以使用
Unscoped找到被软删除的记录
db.Where("age = 20").Find(&user) //会忽略被软删除的内容
db.Unscoped().Where("age = 20").Find(&users) // SELECT * FROM users WHERE age = 20;
//Unscoped可以找到表中符合条件的 软/未删除 记录
- 永久删除
db.Unscoped().Delete(&order)