这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天。
Gorm
一个迭代了10年+的功能强大的ORM框架,在字节内部被广泛运用并且拥有非常丰富的开源拓展。
安装
go get -u github.com/jinzhu/gorm //获取gorm
go get -u github.com/go-sql-driver/mysql //获取mysql支持
使用
查询
注意First()函数查询不到数据时会返回ErrRecordNotFound
Find()查询多条数据,查询不到数据时不会返回错误
使用结构体作为查询条件时,Gorm会查询非零字段。这意味着如果字段值为0,"false"或其他零值,该字段不会被用于构建查询条件。为避免该情况,可以使用map[string]interface{}来构建查询条件以查询零值。
更新
同理,使用结构体更新数据时,只会更新非零值,如果需要更新零值也同样可以用Map或者用Select()选择字段。
删除
在结构体中不包含gorm.DeletedAt类型字段时,使用db.Delete()实现硬删除。 而当结构体中存在gorm.DeletedAt类型字段时,db.Delete()将实现软删除,不从数据库中真正删去数据,而是将DeletedAt设置为当前时间,但该字段无法被正常查询到。 可以使用Unscoped来查询到软删除的数据。 事务 Gorm提供了Begin()、Commit()、Rollback()来实现事务
tx := db.Begin() //开启事务
tx.Rollback() //回滚事务
tx.Commit() //提交事务
也可以用Tansaction来自动提交事务
db.Tansaction(func(tx *gorm.DB) error{
})
Gorm Hook
Gorm提供了Curd的Hook能力,Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数。如果任何Hook返回错误,Gorm将停止后续的操作并回滚事务。
提升性能
Gorm会自动将写操作(创建、更新、删除)封装在事务内运行,故为了提高性能可以使用SkipDefaultTransaction来关闭默认事务。
PrepareStmt能缓存预编译语句,以提高后续调用的速度。
Kitex
字节内部的Golang微服务RPC框架,具有高性能、强可拓展的主要特点,支持多协议并且拥有丰富的开源拓展
Hertz
字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高拓展性特点