说明:天天都是CRUD,就这连个事务都很少用到,gorm其实吧,就算有用到时候,去找,都很可能忽略到一些非常方便的地方,所以,我就打算对gorm官方文档再写一遍注释,当然了对于特别浅显的地方我会一笔带过,对于我写项目中遇到过的,但是gorm中有但是可能没写的,或者不好让人发现的我都会用简单的语言给写出来,让大家意识到,哇,这个东西挺好用的,每天约花费一个小时写注释解释,直到写完
官方文档:https://gorm.io/zh_CN/docs/create.html
CRUD接口
创建
创建记录,用指定字段创建记录,批量插入,根据Map创建,使用 SQL 表达式、Context Valuer 创建记录
这几个模块没啥好说的,略过
创建钩子
BeforeSave,BeforeCreate,AfterSave,AfterCreate
在创建记录时候,将会调用这些钩子方法
go语言里边,方法和函数区别:方法是属于某个对象的,就是一个实体,而这个实体有对应的一个结构体
方法的话指定了这个对象使用这个方法,但是其他的地方就不允许使用这个方法了,因为他不是一个函数
跳过钩子方法:.Session(&gorm.Session{SkipHooks: true})
高级选项
关联创建,没啥好说的
默认值:default:(-):在迁移时跳过默认值定义
Upsert 及冲突,用不上
查询
检索单个对象
// 检查 ErrRecordNotFound 错误,没有找到记录时,它会返回 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)
// 这个经常会用到,例如在创建一个用户的时候,在service层,会用这个判断这个用户表是否有一个用户和创建的名字是相同的
如果你想避免ErrRecordNotFound
错误,你可以使用Find
比如db.Limit(1).Find(&user)
,Find
方法可以接受struct和slice的数据。
看到了一个东西非常神奇,它证明了map[string]interface{}{}类型,可以接受查询到的记录,前提是db.Model(&User{}),不能是db.Table(“users”)
因为:只有在目标 struct 是指针或者通过 db.Model()
指定 model 时,该方法(First和
Last)才有效
result := map[string]interface{}{}
db.Model(&User{}).First(&result)
当查询多条数据时候,下边这个可以返回个数相等于len(users)
,这比较给力,但是我在想.Count和这个有点像呀
result.RowsAffected
String条件
<>代表的意思是:不等于 相当于 !=
db.Where("name <> ?", "jinzhu").Find(&users)
// SELECT * FROM users WHERE name <> 'jinzhu';
Struct & Map条件
gorm真神奇,还可以通过struct和Map查询,可能很少会遇到,但是记录一下
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
db.Where([]int64{20, 21, 22}).Find(&users)
// 当用结构体查询时候,如果设置了零值,那么等于不用这个字段查询了
db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu";
// 要是想要查询-零值的条件查询,可以用映射,就是map
db.Where(map[string]interface{}{"Name": "jinzhu", "Age": 0}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 0;
选定特定字段
貌似就是给age是空值的全都赋值为42
db.Table("users").Select("COALESCE(age,?)", 42).Rows()
// SELECT COALESCE(age,'42') FROM users;
排序
Order排序的意思,desc降序,优先按照age降序排序,再按照name排序
db.Order("age desc, name").Find(&users)
// SELECT * FROM users ORDER BY age desc, name;
上等于下
db.Order("age desc").Order("name").Find(&users)
// SELECT * FROM users ORDER BY age desc, name;
Joins看我之前写的就可以了:https://blog.csdn.net/EGXXM/article/details/126131274?spm=1001.2014.3001.5502
Raw和Scan看这个就行:https://blog.csdn.net/EGXXM/article/details/126136058?spm=1001.2014.3001.5502