数据库配置 原创
我们整个项目会涉及到数据库的操作,所以我们先把数据库连接相关的配置都准备好,到时候可以直接使用。
该项目中,我们将使用 Gorm 来作为底层的数据模型驱动,其功能主要如下:
- 支持主流关系型数据库 MySQL/SQLite/SQL Server/PostgreSQL
- 全功能 ORM (无限接近)
- 模型关联 (Has One, Has Many, Belongs To, Many To Many, 多态)
- 钩子函数 Hook (在创建 / 保存 / 更新 / 删除 / 查找之前或之后)
- 预加载
- 事务
- 复合主键
- SQL 生成器
- 数据库自动迁移
- 自定义日志
- 可扩展性,可基于 GORM 回调编写插件
- 全测试覆盖
1、安装依赖
$ go get gorm.io/gorm
$ go get gorm.io/driver/mysql
由于我们这里只使用 mysql 作为数据存储,所以只安装 mysql 驱动。
2、增加数据库配置信息
首先,在 configs/config.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
中添加数据库的模型定义,如下:
......
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
中添加配置的全局变量,如下:
package global
import "github.com/joker-bai/kubemana/pkg/setting"
var (
ServerSetting *setting.ServerSettingS
DatabaseSetting *setting.DatabaseSettingS
)
最后,在 initialize/setting.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
文件。写入以下内容:
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
文件,添加一个全局的环境变量,如下:
package global
import (
"database/sql"
"gorm.io/gorm"
)
var (
DB *gorm.DB
SQLDB *sql.DB
)
然后,在initialize
包中创建db.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
文件中,如下:
......
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
文件,内容如下:
# 配置文件 #
######################
config.yaml
这样,config.yaml 文件就不会推送到代码仓库了。
但是,为了方便别人使用,我们会放一个配置模板,在configs
目录下创建config.yaml.example
文件,写入以下内容:
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 文件:
$ go mod tidy
6、代码版本
这节内容完成过后,给代码标识版本,如下:
$ git add .
$ git commit -m "初始化数据库配置"