这是我参与「第五届青训营 」伴学笔记创作活动的第 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%左右。