Go 框架三件套详解(Web/RPC/ORM) | 青训营笔记

62 阅读3分钟

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

Gorm

  • Gorm使用名未ID的字段作为主键

  • 使用i建二狗提的蛇形负数作为表名

  • 字段名的蛇形作为列名

  • 创建

    • 使用 Upsert 使用 clause.OnConflict 处理数据冲突
    • 使用默认值使用 default 标签未字段定义默认值
  • 查询

    • 使用 First 时,需要注意查询不到数据会返回 ErrRecordNotFound
    • 使用 Find 查询多条数据,查询不到数据不会返回错误
    • 当时殷弘结构作为条件查询时,Gorm 指挥查询非零值字段,如果字段值未0,‘’,false或者其他零值,改字段不会被用于构建查询条件,使用Map来构建查询条件
  • 更新

    • 使用 Struct 更新时,指挥更新非零值,如果需要更新零值可以使用 Map 更新或使用 Select 选择字段
  • 删除

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

    • Gorm 提供了 Begin、Commit、Rollback 方法用于使用事务
    • Gorm 提供了 Transaction 方法用于自动提交事务,避免用户漏写 Commit、Rollback
  • Gorm Hook

    • Gorm 提供了 CRUD 的 Hook 能力
    • Hook 是在创建、查询、更新、删除等操作之前、之后自动调用的函数
    • 如果任何 Hook 返回错误,Gorm 将停止后续的操作并回滚事务
  • Gorm 性能提高

    • 对于写操作(创建、更新、删除),为了确保数据的完整性,Gorm 会将它们封装再事务内运行,但是会降低性能,可以使用 SkipDefaultTransaction 关闭默认事务
    • 使用 PrepareStmt 缓存预编译语句可以提高后续调用的速度
  • Gorm 常用拓展

Kitex

  • 使用 IDL 定义服务与接口
  • Kitex 生成代码
kitex -module example -service example echo.thrift

build.sh:构建脚本

kitex_gen:IDL 内容相关的生成代码,主要时基础的 Server/Client 代码

main.go:程序入口

handler.go:用户在该文件里实现 IDL service 定义的方法

Hertz

  • Hertz 提供了 GET、POST、PUT、DELETE、ANY 等方法用于注册路由

  • Hertz 提供了参数路由和通配路由,路由的优先级为:静态路由 > 命名路由 > 通配路由

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

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

    • 终止中间件调用链的执行

      • c.Abort
      • c.AbortWithMsg
      • c.AbortWithStats
  • Hertz 提供了代码生成工具 Hz,通过定义 IDL (interface description language)文件即可生成对应的基础服务代码

  • Hertz 生态