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 生态
3. Kitex
生态
4.Hertz
生态
5. 应用实战项目
字节开源项目,整个项目应用了三件套作为开发框架,可供快速入门学习。
easynote
图片均来自字节青训营课程,博客作为自己学习记录,如有侵权,麻烦联系删除。