Go框架三件套 | 青训营笔记

73 阅读4分钟

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

一、本堂课重点内容

本堂课主要介绍Go框架三件套的基本用法,并简单学习他们的实战案例,分别是

  • Web框架Hertz,
  • ORM框架Gorm,
  • RPC框架Kitex。

二、详细知识点介绍

Gorm框架

ORM的全称是object-relation mapping,也就是对象关系(关系型数据库)映射。通过这个框架,我们操作关系型数据库就不用手动写sql了,只需要像操纵对象一样操作它就可以数据库。

type Product struct {
   Code  string
   Price uint
}

定义一个结构体,表示每个字段,对应数据库的每一列。那么一个Product对象就是一条记录。

func (p Product) TableName() string {
   return "product"
}

这个结构体方法可以返回指定的表名。

func main() {
   db, err := gorm.Open(
      mysql.Open("user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"),
      &gorm.Config{})
   if err != nil {
      panic("failed to connect database")
   }

接下来是连接数据库的操作,使用它的open方法,user是自己用户名,pass是该用户名的密码,dbname则是要打开的数据库名。记得要处理错误。

   //Create
   db.Create(&Product{Code: "D42", Price: 100})
   //Read
   var product Product
   db.First(&product, 1)               //根据整型主键查找
   db.First(&product, "code=?", "D42") //查找code字段值为D42的记录
   //Update - 将product的price更新为200
   db.Model(&product).Update("Price", 200)
   //Update - 更新多个字段
   db.Model(&product).Updates(Product{Price: 200, Code: "F42"})
   db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
   //Delete - 删除product
   db.Delete(&product, 1)
}

这里是对数据库的增删操作。

GORM支持Mysql,SQLServer等数据库,GORM通过驱动来连接数据库,大多数数据库有现成的数据库驱动,如果没有,也可以自己写驱动。

GORM创建数据

  • 如何使用Upsert 使用clause.OnConflict处理数据冲突
  • 如何使用默认值 通过使用default标签为字段定义默认值
type User struct {
    ID int64 //GORM默认把ID命名的字段作为主键
    Name string `gorm:"default:galeone"`
    Age int64 `gorm:"default:18"`
}

GORM查询数据

  • First使用注意 使用First时,需要注意查询不到数据会返回ErrRecordNotFound。使用First查询多条数据,查询不到数据不会返回错误。
  • 使用结构体作为查询条件 当使用结构作为条件查询时,GORM只会查询非零值字段。这时候可以用map来构建查询条件。

GORM更新数据

  • 使用db.Where方法条件更新单个列
  • 使用db.Updates方法更新多个列,根据`struct`更新属性,只会更新非零值的字段
  • 使用`map`更新属性
db.Model(&User{ID: 111}).Updates(map[string]interface{}{"name:"hello", "age":18, "actived": false})
  • 更新选定字段
db.Model(&User{ID: 111}.Select("name").Updates(map[string]interface{}{"name":"hello", "age":18, "actived": false})
  • SQL 表达式更新
db.Model(&User{ID: 111}).Update("age", gorm.Expr("age * ? + ?", 2, 100))

GORM删除数据

GORM提供了gorm.DeletedAt软删除,就是说记录不会被从数据库中真正删除,但不能再正常查询到。 物理删除则是常规的从数据库删除记录。

GORM事务

Gorm可以使用Transaction事务将多个创建,更新,删除等操作当作一个原子性操作。

tx := db.Begin() // 开启事务
tx.Create() // 在事务中执行一些数据库操作
tx.Rollback() // 发生错误回滚事务
tx.Commit() // 或者提交这个事务

GORM Hook

hook---钩子函数,是在CRUD前后会自动调用的函数,如果任何Hook返回错误,GORM会停止后续的操作并回滚事务。

GORM包含完整的生态扩展,例如代码生成工具,分片库方案,手动索引,乐观锁,读写分离,Open Telemetry扩展。

Kitex

Kitex是一个Golang的RPC框架,其典型使用场景就是基于thrift定义的IDL来定义服务接口,实现客户端和服务端的通信。

Hertz

Hertz是Golang的Web框架。Hertz提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由。Hertz提供了路由组的能力,用于支持路由分组的功能。Hertz提供了Bind、Vaildate、BindAndValidate函数用于进行参数绑定和校验。Hertz的中间件主要分为客户端中间件和服务的中间件。Hertz提供了HTTP CLient用于帮助用户发送HTTP请求。Hertz还提供了代码生成工具,通过定义IDL文件生成对应的基础服务代码。