Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解

Go 框架三件套

1. 概论

  • Gorm

    Gorm 是一个已经迭代了10年+的功能强大的 ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

  • Kitex

    Kitex 是字节内部 Golang 微服务 RPC 框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展。

  • Hertz

    Hertz 是字节内部的 HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高扩展性特点

2. Gorm

官方文档

 //定义 gorm model 
type Product struct {
	Price uint Code string
}
为 model 定义表名
func (p Product) TableName() string { 
	return "product";
} 
func main(){
  db,err := gorm.0pen(
    连接数据库 
  mysgl.0pen(dsn:"user:passtcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local").&gorm.Config{})
  if err != nil {  
  	panic( v:"failed to connect database")
  }
  // 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[stringlinterface{}{"Price": 200. "Code": "F42"})
  // Delete -删除 product 删除数据 
  db.Delete(&product, 1)
 } 

Notes

  • updates 传递结构体时 仅更新非零值字段,即显性初始化字段

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

  • GORM 查询:

    First 的使用踩坑: 使用 First 时,需要注意查询不到数据会返回 ErrRecordNotFound。使用 Find 查询多条数据,查询不到数据不会返回错误。

    当使用结构作为条件查询时,GORM 只会查询非零值字段。这意味着如果您的字段值为 0、"、false 或其他 零值,该字段不会被用于构建查询条件,使用 Map 来构建查询条件。

  • 删除数据:

    软删除 会记录 Deleted gorm.DeletedAt 字段;

    拥有软删除能力的 Model 调用 Delete 时,记录不会被数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间,并且不能再通过正常查询的方法找到该记录。

    使用 Unscoped 可以查询到被软删除的数据。

  • 事务:

    一致性要求比较高的时候,使用事务; Gorm 提供了 Begin, Commit, Rollback 方法用于使用事务

    Transactions by manual

    //Transactions by manual
    // begin a transaction
    tx := db.Begin()
    
    // do some database operations in the transaction (use 'tx' from this point, not 'db')
    tx.Create(...)
    
    // ...
    
    // rollback the transaction in case of error
    tx.Rollback()
    
    // Or commit the transaction
    tx.Commit()
    

    Transaction

    db.Transaction(func(tx *gorm.DB) error {
      // do some database operations in the transaction (use 'tx' from this point, not 'db')
      if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
        // return any error will rollback
        return err
      }
    
      if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
        return err
      }
    
      // return nil will commit the whole transaction
      return nil
    })
    
  • Hook

    GORM 在 提供了 CURD 的 Hook 能力; Hook 是在创建、查询、更新、删除等操作之前、之后自动调用的函数。
    如果任何 Hook 返回错误,GORM 将停止后续的操作并回滚事务。
    Gorm 生态
    Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解_第1张图片

3. Kitex

官方教程

生态
Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解_第2张图片

4.Hertz

官方教程

生态
Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解_第3张图片

5. 应用实战项目

字节开源项目,整个项目应用了三件套作为开发框架,可供快速入门学习。
easynote

图片均来自字节青训营课程,博客作为自己学习记录,如有侵权,麻烦联系删除。

你可能感兴趣的:(Go,golang,go,微服务)