go 配置Mysql
go 整合Mysql数据库
必要的框架:gin、gorm、mysql,这里的版本可以自己调整
go get github.com/gin-gonic/gin@v1.7.7
go get gorm.io/gorm@v1.25.7
go get gorm.io/driver/mysql@v1.5.7
文件结构
│ config.yaml
│ main.go
├─config
│ config.go
│ conf_mysql.go
├─database
│ db.go
在config文件夹下编写个个组件的配置代码,而config.go是将所有组件的配置合在一起。
1. config.yaml
mysql:
host: "127.0.0.1"
port: 3306
username: "root"
password: "123456"
db_name: "go-library"
config: charset=utf8mb4&parseTime=True&loc=Local
max_open_conns: 25
max_idle_conns: 25
log_mode: info
conn_max_lifetime: 300 # 秒
2. config_mysql.go
package config
import (
"fmt"
"time"
)
type MYSQL struct {
Host string `json:"host" yaml:"host"` // 数据库主机地址
Port int `json:"port" yaml:"port"` // 数据库端口号
Username string `json:"username" yaml:"username"` // 数据库用户名
Password string `json:"password" yaml:"password"` // 数据库密码
DBName string `json:"dbname" yaml:"dbname"` // 数据库名称
Config string `json:"config" yaml:"config"` // 数据库配置参数
MaxIdleConns int `json:"max_idle_conns" yaml:"max_idle_conns"` // 最大空闲连接数
MaxOpenConns int `json:"max_open_conns" yaml:"max_open_conns"` // 最大打开连接数
LogMode string `json:"log_mode" yaml:"log_mode"` // 日志模式
ConnMaxLifetime int `json:"conn_max_lefetime" yaml:"conn_max_lifetime"` // 连接最大生命周期(秒)
}
// DSN 生成MySQL连接DSN
func (m *MYSQL) DSN() string {
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s",
m.Username,
m.Password,
m.Host,
m.Port,
m.DBName,
m.Config,
)
}
// ConnMaxLifetimeDuration 返回ConnMaxLifetime的time.Duration形式
func (m *MYSQL) ConnMaxLifetimeDuration() time.Duration {
return time.Duration(m.ConnMaxLifetime) * time.Second
}
3.config.go
package config
import (
"fmt"
"os"
"gopkg.in/yaml.v2"
)
type Config struct {
Mysql MYSQL `yaml:"mysql"`
}
// LoadConfig 从YAML文件加载配置
func LoadConfig(path string) (*Config, error) {
config := &Config{}
file, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("failed to open config file: %w", err)
}
defer file.Close()
decoder := yaml.NewDecoder(file)
if err := decoder.Decode(config); err != nil {
return nil, fmt.Errorf("failed to decode config: %w", err)
}
return config, nil
}
4. database/db.go
package database
import (
"library-system/config"
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
var DB *gorm.DB
func InitMysql(cfg *config.MYSQL) error{
var err error
DB,err = gorm.Open(mysql.Open(cfg.DSN()),&gorm.Config{
// 全局禁用表名复数
//如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响
NamingStrategy: schema.NamingStrategy{
SingularTable: true, // 使用单数表名
},
})
// 创建数据库连接
if err != nil {
return err
}
// 获取通用数据库对象 sql.DB
sqlDB, err := DB.DB()
if err != nil {
return err
}
// 设置连接池
sqlDB.SetMaxOpenConns(cfg.MaxOpenConns)
sqlDB.SetMaxIdleConns(cfg.MaxIdleConns)
sqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetimeDuration())
// ping一下 测试是否连接成功
if err = sqlDB.Ping(); err != nil {
return err
}
log.Println("数据库连接建立")
return nil
}
// Close 关闭数据库连接
func Close() error {
sqlDB, err := DB.DB()
if err != nil {
return err
}
return sqlDB.Close()
}
5. main.go
package main
import (
"library-system/config"
"library-system/database"
"log"
"github.com/gin-gonic/gin"
)
func main() {
// ------------------------------------ 加载配置 -----------------------------------//
cfg,err := config.LoadConfig("config.yaml")
if err != nil {
log.Fatalf("加载配置失败: %v",err)
}
// 初始化数据库
if err := database.Init(&cfg.Mysql); err != nil {
log.Fatalf("初始化数据库失败: %v",err)
}
defer database.Close()
// ------------------------------------ 加载配置 -----------------------------------//
r := gin.Default()
// 设置信任的代理
r.SetTrustedProxies([]string{"127.0.0.1"})
r.GET("/hello",func (context *gin.Context) {
context.JSON(200,gin.H{"msg": "hello"})
})
r.GET("/user",func (c *gin.Context){
username := c.Query("username")
password := c.Query("password")
c.JSON(200,gin.H{
"username": username,
"password": password,
})
})
//启动服务
r.Run(":8082")
}

浙公网安备 33010602011771号