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
# 安装GORM
go 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 data
import (
"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
}