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

  1. # 进入项目目录
  2. cd user
  3. # 安装GORM
  4. go get -u gorm.io/gorm
  5. # 安装GORM的mysql驱动
  6. go get -u gorm.io/driver/mysql

添加GORM到Kratos

服务内部目录中的data负责业务数据访问,包含 cache、db 等封装,实现了 biz 的 repo 接口。

打开/internal/data.go

  1. // Data .
  2. type Data struct {
  3. // TODO wrapped database client
  4. }

我们可以看到一行显眼的TODO,它示意我们将数据库客户端添加到这里

  1. import (
  2. ......
  3. "gorm.io/gorm" // 引入GORM
  4. )
  5. // Data 封装的数据库客户端
  6. type Data struct {
  7. DataBase *gorm.DB // 数据库
  8. }

在NewData函数中添加*gorm.DB参数使得我们创建出来的Data结构体中带有数据库客户端

  1. func NewData(c *conf.Data, logger log.Logger, db *gorm.DB) (*Data, func(), error) {
  2. cleanup := func() {
  3. log.NewHelper(logger).Info("closing the data resources")
  4. }
  5. return &Data{
  6. DataBase: db,
  7. }, cleanup, nil
  8. }

新建一个NewDataBase函数去创建并且返回*gorm.DB

  1. import (
  2. ......
  3. "gorm.io/driver/mysql" // 引入GORM的mysql驱动
  4. )
  5. // NewDataBase 初始化数据库
  6. func NewDataBase(c *conf.Data) (*gorm.DB, error) {
  7. // dsn 数据库链接
  8. // "用户名":"密码"@tcp("IP":"端口")/"数据库名称"?charset=utf8mb4&parseTime=True&loc=Local
  9. // 不要无脑抄作业哦,根据自己的实际情况修改数据库链接
  10. dsn := "test:test@tcp(localhost:3306)/kratos_demo?charset=utf8mb4&parseTime=True&loc=Local"
  11. db, err := gorm.Open(
  12. mysql.Open(dsn),
  13. &gorm.Config{})
  14. if err != nil {
  15. return nil, err
  16. }
  17. sqlDb, err := db.DB()
  18. if err != nil {
  19. return nil, err
  20. }
  21. // 设置连接池
  22. // 空闲
  23. sqlDb.SetMaxIdleConns(50)
  24. // 打开
  25. sqlDb.SetMaxOpenConns(100)
  26. // 超时
  27. sqlDb.SetConnMaxLifetime(time.Second * 30)
  28. return db, nil
  29. }

将刚刚写好的“NewDataBase”函数加入到依赖提供者集中

修改“/data/data.go”文件中的“wire.NewSet()”函数,在“NewSet”函数里添加“NewDataBase”

  1. // ProviderSet is data providers.
  2. var ProviderSet = wire.NewSet(NewData, NewDataBase)

完成本节后你将得到如下代码

文件: /data/data.go

  1. package data
  2. import (
  3. "github.com/go-kratos/kratos/v2/log"
  4. "github.com/google/wire"
  5. "gorm.io/driver/mysql"
  6. "gorm.io/gorm"
  7. "time"
  8. "user/internal/conf"
  9. )
  10. // ProviderSet is data providers.
  11. var ProviderSet = wire.NewSet(NewData, NewDataBase)
  12. // Data .
  13. type Data struct {
  14. DataBase *gorm.DB // 数据库
  15. }
  16. // NewData .
  17. func NewData(c *conf.Data, logger log.Logger, db *gorm.DB) (*Data, func(), error) {
  18. cleanup := func() {
  19. log.NewHelper(logger).Info("closing the data resources")
  20. }
  21. return &Data{
  22. DataBase: db,
  23. }, cleanup, nil
  24. }
  25. // NewDataBase 初始化数据库
  26. func NewDataBase(c *conf.Data) (*gorm.DB, error) {
  27. // dsn 数据库链接
  28. // "用户名":"密码"@tcp("IP":"端口")/"数据库名称"?charset=utf8mb4&parseTime=True&loc=Local
  29. // 不要无脑抄作业哦,根据自己的实际情况修改数据库链接
  30. dsn := "test:test@tcp(localhost:3306)/kratos_demo?charset=utf8mb4&parseTime=True&loc=Local"
  31. db, err := gorm.Open(
  32. mysql.Open(dsn),
  33. &gorm.Config{})
  34. if err != nil {
  35. return nil, err
  36. }
  37. sqlDb, err := db.DB()
  38. if err != nil {
  39. return nil, err
  40. }
  41. // 设置连接池
  42. // 空闲
  43. sqlDb.SetMaxIdleConns(50)
  44. // 打开
  45. sqlDb.SetMaxOpenConns(100)
  46. // 超时
  47. sqlDb.SetConnMaxLifetime(time.Second * 30)
  48. return db, nil
  49. }