GORM是一个对开发者友好的全功能ORM库,在本节中,我们将在Kratos内使用它。
参考内容:
《GORM 指南》入门指南-连接到数据库: https://gorm.io/zh_CN/docs/connecting_to_the_database.html
《kratos Blog》Go工程化 - Project Layout 最佳实践: https://go-kratos.dev/blog/go-project-layout
工具版本:
mariadb v10.6.5 (可以使用mysql替代,操作无异)
gorm v1.22.3
安装GORM
# 进入项目目录cd user# 安装GORMgo get -u gorm.io/gorm# 安装GORM的mysql驱动go get -u gorm.io/driver/mysql
添加GORM到Kratos
服务内部目录中的data负责业务数据访问,包含 cache、db 等封装,实现了 biz 的 repo 接口。
打开/internal/data.go
// Data .type Data struct {// TODO wrapped database client}
我们可以看到一行显眼的TODO,它示意我们将数据库客户端添加到这里
import (......"gorm.io/gorm" // 引入GORM)// Data 封装的数据库客户端type Data struct {DataBase *gorm.DB // 数据库}
在NewData函数中添加*gorm.DB参数使得我们创建出来的Data结构体中带有数据库客户端
func NewData(c *conf.Data, logger log.Logger, db *gorm.DB) (*Data, func(), error) {cleanup := func() {log.NewHelper(logger).Info("closing the data resources")}return &Data{DataBase: db,}, cleanup, nil}
新建一个NewDataBase函数去创建并且返回*gorm.DB
import (......"gorm.io/driver/mysql" // 引入GORM的mysql驱动)// NewDataBase 初始化数据库func NewDataBase(c *conf.Data) (*gorm.DB, error) {// dsn 数据库链接// "用户名":"密码"@tcp("IP":"端口")/"数据库名称"?charset=utf8mb4&parseTime=True&loc=Local// 不要无脑抄作业哦,根据自己的实际情况修改数据库链接dsn := "test:test@tcp(localhost:3306)/kratos_demo?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn),&gorm.Config{})if err != nil {return nil, err}sqlDb, err := db.DB()if err != nil {return nil, err}// 设置连接池// 空闲sqlDb.SetMaxIdleConns(50)// 打开sqlDb.SetMaxOpenConns(100)// 超时sqlDb.SetConnMaxLifetime(time.Second * 30)return db, nil}
将刚刚写好的“NewDataBase”函数加入到依赖提供者集中
修改“/data/data.go”文件中的“wire.NewSet()”函数,在“NewSet”函数里添加“NewDataBase”
// ProviderSet is data providers.var ProviderSet = wire.NewSet(NewData, NewDataBase)
完成本节后你将得到如下代码
文件: /data/data.go
package dataimport ("github.com/go-kratos/kratos/v2/log""github.com/google/wire""gorm.io/driver/mysql""gorm.io/gorm""time""user/internal/conf")// ProviderSet is data providers.var ProviderSet = wire.NewSet(NewData, NewDataBase)// Data .type Data struct {DataBase *gorm.DB // 数据库}// NewData .func NewData(c *conf.Data, logger log.Logger, db *gorm.DB) (*Data, func(), error) {cleanup := func() {log.NewHelper(logger).Info("closing the data resources")}return &Data{DataBase: db,}, cleanup, nil}// NewDataBase 初始化数据库func NewDataBase(c *conf.Data) (*gorm.DB, error) {// dsn 数据库链接// "用户名":"密码"@tcp("IP":"端口")/"数据库名称"?charset=utf8mb4&parseTime=True&loc=Local// 不要无脑抄作业哦,根据自己的实际情况修改数据库链接dsn := "test:test@tcp(localhost:3306)/kratos_demo?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn),&gorm.Config{})if err != nil {return nil, err}sqlDb, err := db.DB()if err != nil {return nil, err}// 设置连接池// 空闲sqlDb.SetMaxIdleConns(50)// 打开sqlDb.SetMaxOpenConns(100)// 超时sqlDb.SetConnMaxLifetime(time.Second * 30)return db, nil}
