注:本文中与《Go操作MySQL》相关,操作数据库相关参考该片文章
1. 下载 viper 依赖
go get github.com/spf13/viper
1.读取 yaml 文件
1.1 创建 yaml 文件
db:
driverName: mysql
username: root
password: root
address: 127.0.0.1
port: 3306
agreement: tcp
database: my_go
1.2 创建 viper 工具类
package config
import (
"github.com/spf13/viper"
)
const (
YAML = "yaml"
JSON = "json"
INI = "ini"
)
/*
filePath 文件所在目录
fileName 文件名称
fileType 文件类型
*/
func GetConfig(filePath, fileName, fileType string) *viper.Viper {
// 配置文件信息
config := viper.New()
config.AddConfigPath(filePath)
config.SetConfigName(fileName)
config.SetConfigType(fileType)
// 抛出读取异常
if err := config.ReadInConfig(); err != nil {
panic(err)
}
return config
}
1.3 改造数据源信息从配置文件读取
package db
import (
"MyGo/util/config"
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"time"
)
/*
username 用户名
password 密码
host 数据库地址
port 端口
agreement 协议
database 数据库
*/
func ConnMysql(driverName, username, password, host, port, agreement, database string) *sql.DB {
// 数据源信息
dataSourceName := username + ":" + password + "@" + agreement + "(" + host + ":" + port + ")" + "/" + database + "?charset=utf8mb4&parseTime=True&loc=Local"
// 验证 dataSourceName 格式是否正确,非连接测试
db, err := sql.Open(driverName, dataSourceName)
if err != nil {
panic(err)
}
// 配置参数
db.SetConnMaxLifetime(time.Minute * 10)
db.SetConnMaxIdleTime(time.Minute * 10)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)
// 连接数据库,会对数据源信息进行校验
err = db.Ping()
if err != nil {
fmt.Println("数据库连接失败")
panic(err)
}
// 返回数据源实例
return db
}
// 获取默认数据源
func DefaultConn() *sql.DB {
// 获取配置
config := config.GetConfig("./config/", "config_dev", config.YAML)
driverName := config.GetString("db.driverName")
username := config.GetString("db.username")
password := config.GetString("db.password")
host := config.GetString("db.host")
port := config.GetString("db.port")
agreement := config.GetString("db.agreement")
database := config.GetString("db.database")
// 连接数据源
return ConnMysql(driverName, username, password, host, port, agreement, database)
}
1.4 测试数据源是否有效
package main
import (
userMapper "MyGo/mapper/user"
"fmt"
"log"
)
func main() {
queryAllUser()
}
func queryAllUser() {
users := userMapper.QueryUsers()
if users == nil || len(users) == 0 {
log.Fatal("QueryUsers is nil")
}
for i := range users {
user := users[i]
fmt.Println("user:", user)
}
}
1.5 读取所有配置
package main
import (
"MyGo/util/config"
"fmt"
)
func main() {
config := config.GetConfig("./config/", "config_dev", config.YAML)
allSettings := config.AllSettings()
fmt.Println(allSettings)
}