Go框架三件套之Gorm | 青训营笔记

178 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性、高性能、高拓展性特点