Go三件套(Gorm,Kitex,Hertz)介绍|青训营

156 阅读2分钟
title: GO三件套(Gorm,Kitex,Hertz)
categories: 青训营

1.介绍

Gorm:一个被迭代了10年的强大ORM框架

Kitex:字节内部的开源Golang微服务RPC框架

Hertz:字节内部的HTTP框架

2.Gorm

Gorm文档

Gorm用于进行数据库操作

若使用Gorm操作Mysql,安装以下组件:go get -u gorm.io/gorm,go get -u gorm.io/driver/mysql

Gorm通过创建结构体来存储数据库表中的数据,与Mybaits类似,如下,一个Product表,有Code字段和Price字段

type Product struct {
  gorm.Model
  Code  string
  Price uint
}

为model定义表名,以便于操作时使用

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

连接数据库

dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    panic(err)
}

数据库操作,创建数据,查询数据,注意要查询数据要传递引用

// Migrate the schema
  db.AutoMigrate(&Product{})
  // Create
  db.Create(&Product{Code: "D42", Price: 100})
  // Read
  var product Product
  db.First(&product, 1) // find product with integer primary key
  db.First(&product, "code = ?", "D42") // find product with code D42
​
  // Update - update product's price to 200
  db.Model(&product).Update("Price", 200)
  // Update - update multiple fields
  db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fields
  db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
​
  // Delete - delete product
  db.Delete(&product, 1)

2.1Gorm约定:

  • Gorm使用名为ID的字段作为主键
  • 使用CreateAt,UpdatedAt字段作为创建,更新时间

使用gorm字段标签来控制数据库表字段的类型、列大小、默认值等属性,比如使用 column 字段标签来映射数据库中字段名称

type User struct {
    gorm.Model
    Name         string         `gorm:"column:name"`
    Email        *string        `gorm:"column:email"`
    Age          uint8          `gorm:"column:age"`
}

使用clause.OnConflict处理数据冲突,使用default标签可以定义默认值

2.2 增删改查

增删改查

使用struct更新时只会更新非零值,若需要更新零值,可以使用Map更新或使用select选择字段

Gorm提供软删除,当支持软删除的Model被删除时不会真正在数据库中被删除,Gorm将DeleteAt置为当前时间,使得改数据无法通过正常查询被Gorm被查询到

使用First查询查询不到数据时会返回ErrRecordNotFound,但使用FInd查询多条数据不会返回错误

2.3 事务

Gorm提供Begin,Commit,Rollback方法用于使用事务

使用Tansaction方法用于自动提交使用,避免漏写Commit和Rollback

3.Kitex

Kitex:代码生成工具

定义IDL定义服务与接口

Kitex默认监听8888端口

4.Hertz

Hertz文档

启动Hertz服务,使用GET方法注册一个GET方法的路由函数,Hertz将消息分为上下文,一个专注信息,一个专注请求处理,h.Spin()使得在服务介绍之前不会执行后续代码

func main() {
    h := server.Default()
    h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
            ctx.JSON(consts.StatusOK, utils.H{"message": "pong"})
    })
    h.Spin()
}

Hertz也支持路由分组功能

Hertz提供HTTP Client用于发送HTTP请求,以在没有前端页面时测试