初识Go框架三件套之GORM|青训营笔记

155 阅读5分钟

这是我参与「第五届青训营 」笔记创作活动的第3天

一、本堂课重点内容:

软件工具安装

安装Docker/Postman/Git/Golang

  • 安装 Minikube 或 Docker Desktop 用于使用 Docker 安装教程

    • 可以使用 Minikube 或者使用 Docker Desktop 启动 Docker
  • 安装 Postman

  • 安装 Git 安装教程

  • 安装 Go(Golang >= 1.15) 安装教程

ORM 框架——Gorm简介

通过阅读 gorm.cn/docs/#Insta… 尝试运行 Gorm 的示例代码

安装命令

go get -u gorm.io/gorm 
go get -u gorm.io/driver/sqlite 

ORM

Gorm是个已经迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用,并且拥有非常丰富的开源扩展。ORM全称是Object Relational Mapping(对象关系映射),该框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。简单来说ORM框架是一种框架的格式,当前ORM框架主要有五种:Hibernate(Nhibernate),iBatismybatis,EclipseLink,JFinal

二、详细知识点介绍:

接下来会依次对Gorm、Kitex、Hertz的基础使用进行介绍,之所以按照这个顺序是因为一个完整需求流程是,先对数据库(DB)进行基础操作,然后进行RPC的调用,最后写一些API服务,以此对应以上三个框架的用途。

Gorm基础使用

连接数据库

GORM是通过驱动的方式连接数据库的,如果需要连接其他类型的数据库可以复用/自行开发驱动。目前GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server。
eg:连接SQL Server数据库:

import (   
    "gorm.io/driver/sqlserver"   
    "gorm.io/gorm" 
)  
// github.com/denisenkom/go-mssqldb 
dsn := "sqlserver://gorm:LoremIpsum86@localhost:9930?database=gorm" 
db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{})

补充:dsn(Data Source Name数据源名称),是一种数据结构,包含有关打开数据库连接驱动程序连接到数据库所需的特定数据库的信息。Go-MySQL-Driver官方文档

CRUD接口

首先,crud是指在做计算处理时的增加(Create)、读取(Read)、更新(Update)和删除(Delete)几个单词的首字母简写,即增查改删

GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAtUpdatedAt 字段追踪创建、更新时间。模型定义示例如下:

// gorm.Model 的定义 ,对应数据库中的一张表
type Model struct {   
    ID        uint           `gorm:"primaryKey"` //字段标签,可选  
    CreatedAt time.Time   
    UpdatedAt time.Time   
    DeletedAt gorm.DeletedAt `gorm:"index"` 
}

使用示例:

image.png

创建数据

创建记录:

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}

result := db.Create(&user) // 通过数据的指针来创建

user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数

用选定字段的来创建数据:

db.Select("Name", "Age", "CreatedAt").Create(&user) 
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775") 

eg:

image.png

查询数据

检索单个对象

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误。注意:使用First时,需要注意查询不到数据会返回ErrRecordNotFound。使用Find查询多条数据,查询不到数据不会返回错误。

eg:

image.png

注意 当使用结构作为条件查询时,GORM 只会查询非零值字段。这意味着如果您的字段值为 0''false 或其他 零值,该字段不会被用于构建查询条件,例如:

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;

更新数据

同查询类似,使用Struct 更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select选择字段。 eg: image.png

删除数据

物理删除

image.png 软删除

GORM 提供了gorm.DeletedAt用于帮助用户实现软删除, 拥有软删除能力的Model调用Delete时,记录不会被从数据库中真正删除。但GORM 会将DeletedAt置为当前时间,并且你不能再通过正常的查询方法找到该记录。当结构体中包含Deleted gorm.DeletedAt字段后,该结构体便具有了软删能力。

image.png

事务

为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求(当不是关联创建、也没有使用Hook时,就没有必要使用事务),您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。

手动事务:Gorm提供了Begin、Commit、Rollback方法用于使用事务

// 开始事务
tx := db.Begin()

// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
tx.Create(...)

// ...

// 遇到错误时回滚事务
tx.Rollback()

// 否则,提交事务
tx.Commit()

eg:

image.png

自动提交事务:Gorm 提供了Tansaction方法用于自动提交事务,避免用户漏写Commit、Rollbcak。 eg:

image.png

Hook

Hook(钩子)是在创建、查询、更新、删除等操作之前、之后调用的函数。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。钩子方法的函数签名应该是 func(*gorm.DB) error

eg:

image.png

RORM生态

一些常用的GORM扩展: image.png

引用参考:

GORM参考文档
RPC百度百科