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

33 阅读2分钟

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

1. 简介

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

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

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

2. 三件套的使用

2.1 Grom的基本使用

//定义gorm model
type Product struct {
   Code string
   Price uint
}
//为model定义表名
func (p Product) TalleMame() string {
   reture "product"
}
//连接数据库
func main () {
   db,enr := garm.Open{
   mysql.Open( dsm: "usor:pasagtep(127.8.0.1:3306]/dbnsane ?charset=utf8mh4igarseTine=Truflec=Lotal"),&gorm. Config{})
   if ere != nil {
      panic("failed to connect database")
}
//创建数据
db.Create(Product{Code: "D42",Price: 100})
//查询数据
var product Product
db.First(&product,1)
db.First(&product,"code = ?","042")
db.Model(&product).Update("Price",200)
db.Model(&product).Updates(Product{Price: 200,Code : "F42"})
db.Model(&product).Updates(map[string]interface{}{"Price" : 200"code" : "F42")
db.Delete(&product,1)

2.2 Grom支持的数据库

GORM目前支持MySQL、SQL Server,PostgreSQL、SQLite。
GORM通过驱动来连接数据库,如果需要连接其他类型的数据库,可以复用/自行开发驱动。

2.3 Grom创建数据

如何使用Upsert?
使用clause.OnConflict处理数据冲突

p:=&Product{Code:"042",ID:1}
db.Clauses(clause.OnConflict{DoNothing:true}).Create(&p)

如何使用默认值?
通过使用default标签为字段定义默认值

type User struct { 
    gorm.Model // 包含了ID和三个time 
    Username string `gorm:"type:varchar(20);not null " json:"username" validate:"required,min=4,max=12" label:"用户名"` 
    Password string `gorm:"type:varchar(500);not null" json:"password" validate:"required,min=6,max=120" label:"密码"` 
    Role int `gorm:"type:int;DEFAULT:2" json:"role" validate:"required,gte=2" label:"角色码"` }

增删改查

// 通过数据的指针来创建 
db.Create(&user) // user可以是切片来实现批量插入 
// 带额外条件的删除 
db.Where("name = ?", "jinzhu").Delete(&email) 
// 条件更新 
db.Model(&User{}).Where("active = ?", true).Update("name", "hello") 
// 获取第一条记录(主键升序) 
db.First(&user) 
db.Where("name = ?", "jinzhu").First(&user) 
// joins 
db.Model(&User{}).Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&result{}) 
// 分页获取 
DB.Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&users).Error

HOOK
Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数
可以使用在比如说密码加密时,在创建密码之前调用一个加密函数

// 开始事务
BeforeSave
BeforeCreate
// 关联前的 save
// 插入记录至 db
// 关联后的 save
AfterCreate
AfterSave
// 提交或回滚事务

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
  u.UUID = uuid.New()

  if !u.IsValid() {
    err = errors.New("can't save invalid data")
  }
  return
}

Gorm性能提高
对于写操作(创建、更新、删除),为了确保数据的完整性,GORM会将它们封装在事务内运行。但这会降低性能,可以使用SkipDefaultTransaction关闭默认事务。

使用PrepareStmt缓存预编译语句可以提高后续调用的速度,本机测试提高大约35%左右。