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

63 阅读2分钟

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

一、本堂课重点内容

本堂课的知识要点有哪些?

Go框架三件套(Web/RPC/ORM)

  • 1.Gorm
  • 2.Kitex
  • 3.Hertz

二、详细知识点介绍

本堂课介绍了哪些知识点?

Gorm

  • Gorm的基本使用

    • 定义gorm model
    • 为model定义表名
    • 连接数据库
    • 创建数据
    • 查询数据
      • First 方法返回符合指定条件的首个记录值;值得注意的是,使用 First 方法进行查询时,如果查找不到数据会返回 ErrRecodeNotFound 错误。可以使用 Find 查询多条记录,而 Find 方法在查询不到数据的时候并不会返回错误。
      • 除了此种查询方式外,还可使用 Where 子句查询:
// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;

// Get all matched records
db.Where("name <> ?", "jinzhu").Find(&users)
// SELECT * FROM users WHERE name <> 'jinzhu';

// IN
db.Where("name IN ?", []string{"jinzhu", "jinzhu 2"}).Find(&users)
// SELECT * FROM users WHERE name IN ('jinzhu','jinzhu 2');

// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%jin%';

// AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;

// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';

// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';
  • 更新数据

  • 删除数据

  • Gorm支持的数据库

    • Gorm目前支持MySQL、SQLServer、PostgreSQL
    • Gorm通过驱动来连接数据库,如果需要连接其它类型的数据库,可以复用/自行开发驱动
  • Gorm 创建数据

    • 如何使用 Upsert ?
    • 如何使用默认值?
  • Gorm 查询数据

  • Gorm 更新数据

  • Gorm 删除数据

    • 物理删除
    • 软删除
  • Gorm 事务

    • Gorm 提供了Begin、Commit、Rollback方法用于使用事务
    • Gorm 提供了Tansaction 方法用于自动提交事务,避免用户漏写Commit、Rollback,也可以使用手动方法创建提交事务
  • Gorm Hook

    • Gorm 在提供了CURD的 Hook 能力
    • Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数
    • 如果任何Hook返回错误,Gorm将停止后续的操作并回滚事务。
type User struct {
    ID      int64
    Name    string `gorm:"default:galeone"`
    Age     string `gorm:"default:18"`
}
​
type Email struct {
    ID      int64
    Name    string
    Email   string
}
​
func (u *User) BeforeCreate(tx `gorm.DB) (err error) {
    if u.Age < 0 {
        return errors.New("can't save invalid data")
    }
    return nil;
}
​
func (u *User) AfterCreate(tx `gorm.DB) (err error) {
    return tx.Create(&Email{ID: u.ID, Email: i.Name + "@***.com"}).Error
}
  • Gorm 性能提高

    启用预编译语句缓存以提高性能。

    db.AutoMigrate(&Product{})
    

Kitex

目前资料比较少,可以深入了解一下

  • 安装Kitex代码生成工具

  • 定义IDL

    • 使用IDL定义服务与接口
  • Kitex生成代码

    • 使用 kitex -module example -service example echo.thrift 命令生成代码
  • Kitex 基本使用

    • 服务默认监听8888端口
  • Kitex Client 发起请求

    • 创建Client
    • 发起请求
  • Kitex 服务注册与发现

    • 目前Kitex的服务注册与发现已经对接了主流的服务注册与发现中心,如ETCD,Nacos等
  • Kitex 生态

Hertz

(和gin区分)

  • Hertz 基本使用

  • Hertz 路由

    • Hertz提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由
    • Hertz提供了路由器(Group)的能力,用于支持路由分组的功能。
    • Hertz提供了参数路径和通配路由,路由的优先级为:静态路由 > 命名路由 > 通配路由
  • Hertz 参数绑定

    • Hertz 提供了Bind、Validate、BindAndValidate函数用于进行参数绑定和校验
  • Hertz 中间件

    • Hertz的中间件主要分为客户端中间件和服务端中间件
  • Hertz Client

  • Hertz 代码生成工具

  • Hertz 性能

  • Hertz 生态