user/pkg/mysql/db.go
timerzz e7e3309896 优化Docker构建流程
- 添加UPX压缩步骤减小可执行文件体积
- 使用多阶段构建减小最终镜像大小
- 更新基础镜像到最新版本
2025-04-22 17:30:36 +08:00

69 lines
1.7 KiB
Go

package mysql
import (
"fmt"
"log"
"os"
"time"
"github.com/caarlos0/env/v11"
"github.com/cloudwego/hertz/pkg/common/hlog"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)
type Config struct {
Address string `env:"MYSQL_ADDRESS"`
User string `env:"MYSQL_USERNAME"`
Password string `env:"MYSQL_PASSWORD"`
DBName string `env:"MYSQL_DBNAME"`
}
// InitDB 初始化数据库连接
func InitDB() *gorm.DB {
var cfg Config
if err := env.Parse(&cfg); err != nil {
hlog.Fatalf("解析数据库环境变量失败: %v", err)
}
// 配置日志
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second, // 慢SQL阈值
LogLevel: logger.Warn, // 日志级别
IgnoreRecordNotFoundError: true, // 忽略记录未找到错误
Colorful: true, // 彩色输出
},
)
// 配置GORM
config := &gorm.Config{
Logger: newLogger,
NamingStrategy: schema.NamingStrategy{
SingularTable: true, // 使用单数表名
},
}
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.User, cfg.Password, cfg.Address, cfg.DBName)
// 连接数据库
DB, err := gorm.Open(mysql.Open(dsn), config)
if err != nil {
hlog.Fatalf("连接数据库失败: %v", err)
}
hlog.Info("数据库连接成功")
// 获取底层SQL连接池
sqlDB, err := DB.DB()
if err != nil {
hlog.Fatalf("获取数据库连接池失败: %v", err)
}
// 设置连接池参数
sqlDB.SetMaxIdleConns(10) // 最大空闲连接数
sqlDB.SetMaxOpenConns(100) // 最大打开连接数
sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大生命周期
return DB
}