Skip to content

数据库配置 原创

我们整个项目会涉及到数据库的操作,所以我们先把数据库连接相关的配置都准备好,到时候可以直接使用。

该项目中,我们将使用 Gorm 来作为底层的数据模型驱动,其功能主要如下:

  • 支持主流关系型数据库 MySQL/SQLite/SQL Server/PostgreSQL
  • 全功能 ORM (无限接近)
  • 模型关联 (Has One, Has Many, Belongs To, Many To Many, 多态)
  • 钩子函数 Hook (在创建 / 保存 / 更新 / 删除 / 查找之前或之后)
  • 预加载
  • 事务
  • 复合主键
  • SQL 生成器
  • 数据库自动迁移
  • 自定义日志
  • 可扩展性,可基于 GORM 回调编写插件
  • 全测试覆盖

1、安装依赖

go
$ go get gorm.io/gorm
$ go get gorm.io/driver/mysql

由于我们这里只使用 mysql 作为数据存储,所以只安装 mysql 驱动。

2、增加数据库配置信息

首先,在 configs/config.yaml 中添加以下数据库配置:

yaml
......
Database:
  DBType: mysql
  Username: root
  Password: 123456
  Host: 127.0.0.1:3306
  DBName: kubemana
  Charset: utf8
  ParseTime: True
  MaxIdleConns: 10
  MaxOpenConns: 30
  MaxLifeSeconds: 300

然后,在 pkg/setting/section.go 中添加数据库的模型定义,如下:

go
......
type DatabaseSettingS struct {
	DBType         string
	Username       string
	Password       string
	Host           string
	DBName         string
	Charset        string
	ParseTime      bool
	MaxIdleConns   int
	MaxOpenConns   int
	MaxLifeSeconds time.Duration
}
......

再然后,在global/setting.go中添加配置的全局变量,如下:

go
package global

import "github.com/joker-bai/kubemana/pkg/setting"

var (
	ServerSetting   *setting.ServerSettingS
	DatabaseSetting *setting.DatabaseSettingS
)

最后,在 initialize/setting.go 中将数据库的配置注册进去,以便能正常读取到配置,如下:

go
package initialize

import (
	"time"

	"github.com/joker-bai/kubemana/global"
	"github.com/joker-bai/kubemana/pkg/setting"
)

func SetupSetting() error {
......
	err = setting.ReadSection("Database", &global.DatabaseSetting)
	if err != nil {
		return err
	}
......
}

2、新增 database 包

pkg/database 目录中新增 database.go 文件。写入以下内容:

go
package database

import (
	"database/sql"

	"gorm.io/gorm"
	gormlogger "gorm.io/gorm/logger"
)

// Connect 连接数据库
func Connect(dbConfig gorm.Dialector, _logger gormlogger.Interface) (*gorm.DB, *sql.DB, error) {

	// 使用 gorm.Open 连接数据库
	db, err := gorm.Open(dbConfig, &gorm.Config{
		Logger: _logger,
	})
	// 处理错误
	if err != nil {
		return nil, nil, err
	}

	sqldb, err := db.DB()
	if err != nil {
		return nil, nil, err
	}
	return db, sqldb, nil
}

上面的配置是连接数据库,获取数据库操作实例。

3、初始化数据库

首先,我们global目录中添加db.go文件,添加一个全局的环境变量,如下:

go
package global

import (
	"database/sql"

	"gorm.io/gorm"
)

var (
	DB    *gorm.DB
	SQLDB *sql.DB
)

然后,在initialize包中创建db.go文件,实现数据库初始化的方法,代码如下:

go
package initialize

import (
	"fmt"
	"time"

	"github.com/joker-bai/hawkeye/global"
	"github.com/joker-bai/hawkeye/pkg/database"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

// SetupDB 初始化DB
func SetupDB() error {
	var dbConfig gorm.Dialector
	switch global.DatabaseSetting.DBType {
	case "mysql":
		dsn := fmt.Sprintf("%v:%v@tcp(%v)/%v?charset=%v&parseTime=%v&multiStatements=true&loc=Local",
			global.DatabaseSetting.Username,
			global.DatabaseSetting.Password,
			global.DatabaseSetting.Host,
			global.DatabaseSetting.DBName,
			global.DatabaseSetting.Charset,
			global.DatabaseSetting.ParseTime,
		)
		dbConfig = mysql.New(mysql.Config{
			DSN: dsn,
		})
	}
	// 连接数据库,并设置 GORM 的日志模式
	var err error
	global.DB, global.SQLDB, err = database.Connect(dbConfig, logger.Default.LogMode(logger.Info))
	if err != nil {
		return err
	}

	// 设置最大连接数
	global.SQLDB.SetMaxOpenConns(global.DatabaseSetting.MaxOpenConns)
	// 设置最大空闲连接数
	global.SQLDB.SetMaxIdleConns(global.DatabaseSetting.MaxIdleConns)
	// 设置每个链接的过期时间
	global.SQLDB.SetConnMaxLifetime(global.DatabaseSetting.MaxLifeSeconds * time.Second)
	return nil
}

最后,将初始化数据库动作加入 main.go 文件中,如下:

go
......
func init() {
	// 初始化配置
	if err := initialize.SetupSetting(); err != nil {
		log.Fatalf("Failed to init setting, error: %s", err)
	}
	// 初始化数据库
	if err := initialize.NewDatabase(); err != nil {
		log.Fatalf("Failed to init database, error: %s", err)
	}
}
......

到此数据库的配置已经完毕。

4、添加.gitignore 文件

有时候我们不希望配置文件被推送到代码仓库,这时候我们可以在configs目录中添加.gitignore文件,内容如下:

go
# 配置文件 #
######################
config.yaml

这样,config.yaml 文件就不会推送到代码仓库了。

但是,为了方便别人使用,我们会放一个配置模板,在configs目录下创建config.yaml.example文件,写入以下内容:

yaml
Server:
  RunMode: debug
  Port: 8080
  ReadTimeout: 3600
  WriteTimeout: 3600
  IdleTimeout: 300
Database:
  DBType: mysql
  Username: root
  Password: 123456
  Host: 127.0.0.1:3306
  DBName: kubemana
  Charset: utf8
  ParseTime: True
  MaxIdleConns: 10
  MaxOpenConns: 30
  MaxLifeSeconds: 300

后续有新的配置,改文件和config.yaml文件同步更新。

5、更新依赖

加载了新的库,现在使用 go mod tidy 命令来整理一下 go.mod 文件:

yaml
$ go mod tidy

6、代码版本

这节内容完成过后,给代码标识版本,如下:

yaml
$ git add .
$ git commit -m "初始化数据库配置"
最近更新