gorm再入门系列02

说明:天天都是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 时,该方法(FirstLast)才有效

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值