Go框架三件套详解(1):Gorm | 青训营笔记

68 阅读2分钟

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

0、重点

  • Gorm
  • Kitex(后续)
  • Hertz(后续)

1、Gorm

参考文档:GORM指南

1.1 Gorm的基本使用

  • gorm的基本使用:
    • 定义gorm model
    • 为model定义表名
    • 连接数据库
    • 创建数据
    • 查询数据
    • 更新数据
    • 删除数据
    package main
    
    import (
      "gorm.io/gorm"
      "gorm.io/driver/sqlite"
    )
    
    type Product struct {
      gorm.Model
      Code  string
      Price uint
    }
    
    func main() {
      db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
      if err != nil {
        panic("failed to connect database")
      }
    
      // 迁移 schema
      db.AutoMigrate(&Product{})
    
      // 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的约定:
    • Gorm使用名为ID的字段作为主键
    • 使用结构体的蛇形负数作为表名
    • 字段名的蛇形作为列名
    • 使用CreateAt、updateAt字段作为创建、更新时间

1.2 Gorm支持的数据库

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

1.3 Gorm 创建数据

  • 如何使用 Upsert
    • 使用clause.OnConflict处理数据冲突
  • 如何使用默认值
    • 通过使用defalut标签为字段定义默认值

1.4 Gorm 查询数据

  • 使用First时查询不到数据会返回ErrRecordNotFound
  • 使用find查询多条数据,查询不到数据不会返回错误
  • 使用结构体作为查询条件时,gorm只会查询非零字段

1.5 Gorm 更新数据

1.6 Gorm 删除数据

  • 物理删除
  • 软删除
    • gorm.DeleteAt实现软删除

1.7 Gorm 事务

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

1.8 Gorm Hook

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

1.9 Gorm 性能提高

1.10 Gorm 生态

image.png