1.首先准备文件
config-app.yml 用来存放mysql配置
config-config.go 读取配置文件、初始化配置结构体
test-testGorm.go 建立数据库连接等基本功能
2.app.yml
mysqldb:
username: root
password: wh123456
host: localhost
port: 3306
name: ginchat
charset: utf8mb4
parseTime: True
loc: Local
这是应用程序配置文件 app.yml
。它以 YAML 格式存储了数据库连接信息和其他配置项。
mysqldb
是一个键,对应一个包含数据库连接信息的子映射。username
,password
,host
,port
,name
,charset
,parseTime
,loc
是数据库连接的具体参数。
3.config.go
// config/config.go
package config
import (
"fmt"
"strconv"
"github.com/spf13/viper"
)
// DatabaseConfig 结构体定义了数据库连接的配置项
type DatabaseConfig struct {
Username string `mapstructure:"username"` // 用户名
Password string `mapstructure:"password"` // 密码
Host string `mapstructure:"host"` // 主机地址
Port string `mapstructure:"port"` // 端口号
Name string `mapstructure:"name"` // 数据库名称
Charset string `mapstructure:"charset"` // 字符集
ParseTime bool `mapstructure:"parseTime"` // 解析时间
Loc string `mapstructure:"loc"` // 时区
}
// AppConfig 结构体定义了整体应用程序的配置
type AppConfig struct {
Database DatabaseConfig
// 可以添加其他配置项
}
// AppConfigInstance 是 AppConfig 的实例,用于存储配置信息
var AppConfigInstance *AppConfig
// GetDBConfig 用于生成数据库连接字符串
func (dbConfig *DatabaseConfig) GetDBConfig() string {
// 将布尔值转换为字符串 // ParseTime 是个bool类型 在进行过程中值会变成false
parseTimeStr := strconv.FormatBool(AppConfigInstance.Database.ParseTime)
// 格式化数据库连接字符串
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=%s&loc=%s",
dbConfig.Username, dbConfig.Password, dbConfig.Host, dbConfig.Port,
dbConfig.Name, dbConfig.Charset, parseTimeStr, dbConfig.Loc)
fmt.Printf("ParseTime value from config: %v\n", dsn)
return dsn
}
// LoadConfig 用于加载配置文件并初始化 AppConfigInstance
func LoadConfig() {
fmt.Println("开始读取配置")
viper.SetConfigName("app") // 文件名(无扩展名)
viper.SetConfigType("yml") // 文件类型
viper.AddConfigPath("config") // 文件路径
// 初始化 AppConfigInstance
AppConfigInstance = &AppConfig{}
// 读取配置文件
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("配置文件读取错误: %s \n", err))
}
// 打印读取到的配置
// fmt.Printf("Read config from file: %+v\n", viper.AllSettings())
// 解析配置文件中的 mysqldb 部分到 AppConfigInstance.Database
err = viper.UnmarshalKey("mysqldb", &AppConfigInstance.Database)
if err != nil {
panic(fmt.Errorf("配置文件解析错误: %s \n", err))
}
// 打印结构体内容
fmt.Printf("AppConfigInstance.Database: %+v\n", AppConfigInstance.Database)
fmt.Printf("AppConfigInstance: %+v\n", AppConfigInstance)
}
这是配置相关的 Go 代码文件 config.go
。以下是每个部分的解释:
DatabaseConfig
结构体定义了数据库连接的各个参数,并使用mapstructure
标签指定了 YAML 配置文件中的字段名。AppConfig
结构体包含一个Database
字段,用于存储数据库配置。GetDBConfig
函数生成数据库连接字符串。LoadConfig
函数用于加载配置文件,初始化AppConfigInstance
并将配置映射到结构体。
4.testGorm.go
package main
import (
"fmt"
"ginchat.com/config"
"ginchat.com/models"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 初始化 AppConfigInstance 并加载配置
config.AppConfigInstance = &config.AppConfig{}
// 加载配置
config.LoadConfig()
// fmt.Printf("AppConfigInstance: %+v\n", config.AppConfigInstance)
// 数据库连接
db, err := gorm.Open(mysql.Open(config.AppConfigInstance.Database.GetDBConfig()), &gorm.Config{})
if err != nil {
println("db:", db)
panic("数据库连接失败")
}
fmt.Println("数据库连接成功!")
// 在这里可以继续编写你的应用程序逻辑
}
这是连接数据库测试文件 main.go
,其中包含了应用程序的入口点。以下是解释:
main
函数中初始化了AppConfigInstance
并调用了LoadConfig
函数加载配置。- 使用
gorm.Open
打开数据库连接,并在成功时输出连接成功的消息。
这三个文件一起工作,实现了读取配置文件、初始化配置结构体、建立数据库连接等基本功能。