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")
}
posted @ 2025-05-13 10:24  Liang2003  阅读(16)  评论(0)    收藏  举报