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 }