这是我参与[第五届青训营]伴学笔记创作活动的第4天
一.本堂课重要内容
- Gorm的基础使用
二.详细知识点介绍
什么是Gorm?
Gorm是一个已经迭代了10年+的功能强大的ORM(Object Relational Mapping (对象 关系 映射) 简单的说,orm是通过使用描述对象和数据之间映射的元数据,将程序中的对象自动持久化到关系数据库) 框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。Gorm目前支持MySQL, SQLServer,PostgreSQL, SQLite。
Gorm的基础使用
-
Gorm的基本使用
Gorm使用时要定义一个gorm model,model中的字段为表中的各列元素,可以为model定义表名,Gorm中默认约定,使用名的ID字段作为主键,使用结构体的蛇形负数作为表名,字段名的蛇形作为列名,使用CreatedAt和UpdatedAt作为创建和更新时间。
-
Gorm连接数据库
Gorm通过驱动来连接数据库,可以通过复用/自行开发驱动,下列以连接SQLServer数据库为例
-
Gorm创建数据
Gorm可以在结构体中指定默认值,使用default标签即可,例子如下
Gorm通过Create来创建数据,创建数据时要用到指针,若创建一条数据
p := &Product{Code : "D42"}
res := db.Create(p)
若创建多条数据,要用到数组
products := []*Product{{Code : "D41"}, {Code : "D42"}, {Code : "D43"}}
res := db.Create(products)
-
Gorm查询数据
用Gorm查询数据单条数据可以使用First,First用来获取数据库中的第一条记录(主键升序)
//select * from users order by id limit 1
db.First(u)
也可以用Find查询多条数据,查询多条语句时,可以配套使用Where用来规定语句条件
//select * from users where age > 10
result = db.Where("age > 10").Find(&users)
注意,使用First查询不到数据会返回ErrRecordNotFound,使用Find查询不到数据不会返回错误。当使用结构体作为查询条件时,Gorm只会查询非零字段,这意味着如果您的字段为0,"",false或其他零值,该字段不会被用于查询条件,使用Map来构建查询条件。
其他具体条件查询使用方法如下图
-
Gorm更新数据
条件更新单个列
//update users set name = 'hello' ,updated_at = '2023-1-22 17:59:43' where age > 18;
db.Model(&User{ID : 111}).Where("age > ?",18).Update("name","hello"))
上列语句中Model中的User相当于一个占位,当没有where条件时,就将表中id为111的数据查询出来
条件更新多个列
//update users set name = 'hello',age = 18,updated_at = '2023-1-22 17:59:43' where id = 111;
db.Model(&User{ID : 111}).Updates(User{Name : "hello" , Age : 18})
像上列语句用结构体更新列,只会更新非零值,如果需要更新零值可以使用map更新或者使用Select选择字段,具体实现如下图
-
Gorm删除数据
Gorm中通过使用Delete来进行物理删除
//delete from users where id = 10;
db.Delete(&User{},10)
更多删除实现如下图
Gorm也提供了gorm.DeletedAt用于帮助用户实现软删除,拥有软删能力的Model调用Delete时,记录不会被从数据库中真正的删除,但Gorm会将DeletedAt置为当前时间,并且你不能通过正常的查询方法找到该记录。使用Upscopde可以查询到被软删的数据
-
Gorm事务
Gorm不仅提供了Begin,Commit,Rollback方法用于使用事务,还提供了Transaction方法用于自动提交事务
-
Gorm Hook
Hook是在创建,查询,更新,删除等操作之前,之后自动调用的函数。如果任何Hook返回错误,Gorm将停止后续的操作并回滚事务
-
Gorm性能提高
对于写操作(创建,更新,删除),为了确保数据的完整性,Gorm会将他们封装在事务内运行,但这会降低性能,可以使用SkipDefaulTransaction关闭默认事务
使用PrepareStmt缓存编译语句可以提高后续调用的速度
-
Gorm生态
Gorm拥有非常丰富的扩展生态,以下举例一部分常用扩展
三.课后个人体会与总结
在我个人看来,Gorm 有点相当于java中的JDBC,但对于JDBC来说,又好像简单许多,这是Go语言的又一个学习内容,经过这么多天的学习,对Go语言的语法和用法有了初步的了解,坚持下去,相信自己会越来越好
四.引用
字节录播课 - Gorm的基本使用