title: GO三件套(Gorm,Kitex,Hertz)
categories: 青训营
1.介绍
Gorm:一个被迭代了10年的强大ORM框架
Kitex:字节内部的开源Golang微服务RPC框架
Hertz:字节内部的HTTP框架
2.Gorm
Gorm用于进行数据库操作
若使用Gorm操作Mysql,安装以下组件:go get -u gorm.io/gorm,go get -u gorm.io/driver/mysql
Gorm通过创建结构体来存储数据库表中的数据,与Mybaits类似,如下,一个Product表,有Code字段和Price字段
type Product struct {
gorm.Model
Code string
Price uint
}
为model定义表名,以便于操作时使用
func (p Product) TableName() string{
return "product"
}
连接数据库
dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
数据库操作,创建数据,查询数据,注意要查询数据要传递引用
// Migrate the schema
db.AutoMigrate(&Product{})
// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.First(&product, 1) // find product with integer primary key
db.First(&product, "code = ?", "D42") // find product with code D42
// Update - update product's price to 200
db.Model(&product).Update("Price", 200)
// Update - update multiple fields
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fields
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - delete product
db.Delete(&product, 1)
2.1Gorm约定:
- Gorm使用名为ID的字段作为主键
- 使用CreateAt,UpdatedAt字段作为创建,更新时间
使用gorm字段标签来控制数据库表字段的类型、列大小、默认值等属性,比如使用 column 字段标签来映射数据库中字段名称
type User struct {
gorm.Model
Name string `gorm:"column:name"`
Email *string `gorm:"column:email"`
Age uint8 `gorm:"column:age"`
}
使用clause.OnConflict处理数据冲突,使用default标签可以定义默认值
2.2 增删改查
使用struct更新时只会更新非零值,若需要更新零值,可以使用Map更新或使用select选择字段
Gorm提供软删除,当支持软删除的Model被删除时不会真正在数据库中被删除,Gorm将DeleteAt置为当前时间,使得改数据无法通过正常查询被Gorm被查询到
使用First查询查询不到数据时会返回ErrRecordNotFound,但使用FInd查询多条数据不会返回错误
2.3 事务
Gorm提供Begin,Commit,Rollback方法用于使用事务
使用Tansaction方法用于自动提交使用,避免漏写Commit和Rollback
3.Kitex
Kitex:代码生成工具
定义IDL定义服务与接口
Kitex默认监听8888端口
4.Hertz
启动Hertz服务,使用GET方法注册一个GET方法的路由函数,Hertz将消息分为上下文,一个专注信息,一个专注请求处理,h.Spin()使得在服务介绍之前不会执行后续代码
func main() {
h := server.Default()
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{"message": "pong"})
})
h.Spin()
}
Hertz也支持路由分组功能
Hertz提供HTTP Client用于发送HTTP请求,以在没有前端页面时测试