Gorm的基础使用 | 青训营笔记

110 阅读4分钟

这是我参与[第五届青训营]伴学笔记创作活动的第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作为创建和更新时间。

屏幕截图_20230122_171734.png

  • Gorm连接数据库

Gorm通过驱动来连接数据库,可以通过复用/自行开发驱动,下列以连接SQLServer数据库为例

屏幕截图_20230122_172355.png

  • Gorm创建数据

Gorm可以在结构体中指定默认值,使用default标签即可,例子如下

屏幕截图_20230122_172920.png

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来构建查询条件。

其他具体条件查询使用方法如下图

屏幕截图_20230122_175306.png

  • 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选择字段,具体实现如下图

屏幕截图_20230122_180901.png

  • Gorm删除数据

Gorm中通过使用Delete来进行物理删除

//delete  from users where id = 10; 
db.Delete(&User{},10)

更多删除实现如下图

屏幕截图_20230122_181408.png

Gorm也提供了gorm.DeletedAt用于帮助用户实现软删除,拥有软删能力的Model调用Delete时,记录不会被从数据库中真正的删除,但Gorm会将DeletedAt置为当前时间,并且你不能通过正常的查询方法找到该记录。使用Upscopde可以查询到被软删的数据

屏幕截图_20230122_182010.png

  • Gorm事务

Gorm不仅提供了Begin,Commit,Rollback方法用于使用事务,还提供了Transaction方法用于自动提交事务

屏幕截图_20230122_192119.png

屏幕截图_20230122_192108.png

  • Gorm Hook

Hook是在创建,查询,更新,删除等操作之前,之后自动调用的函数。如果任何Hook返回错误,Gorm将停止后续的操作并回滚事务

屏幕截图_20230122_192737.png

  • Gorm性能提高

对于写操作(创建,更新,删除),为了确保数据的完整性,Gorm会将他们封装在事务内运行,但这会降低性能,可以使用SkipDefaulTransaction关闭默认事务

使用PrepareStmt缓存编译语句可以提高后续调用的速度

屏幕截图_20230122_192919.png

  • Gorm生态

Gorm拥有非常丰富的扩展生态,以下举例一部分常用扩展

屏幕截图_20230122_193459.png

三.课后个人体会与总结

在我个人看来,Gorm 有点相当于java中的JDBC,但对于JDBC来说,又好像简单许多,这是Go语言的又一个学习内容,经过这么多天的学习,对Go语言的语法和用法有了初步的了解,坚持下去,相信自己会越来越好

四.引用

字节录播课 - Gorm的基本使用