// =========================================== // 多班级版班级管理系统 - Go 后端 // // 开发者: Canglan // 联系方式: admin@sea-studio.top // 版权归属: Sea Network Technology Studio // 许可证: Apache License 2.0 // // 版权所有 © Sea Network Technology Studio // =========================================== package database import ( "fmt" "strings" "time" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/config" ) // DB 全局数据库实例 var DB *gorm.DB // InitMySQL 初始化 MySQL 连接池 func InitMySQL(cfg *config.Config) (*gorm.DB, error) { dsn := cfg.DSN() // 根据 LogLevel 配置设置 GORM 日志级别 gormLogLevel := logger.Info switch strings.ToLower(cfg.LogLevel) { case "silent": gormLogLevel = logger.Silent case "error": gormLogLevel = logger.Error case "warn", "warning": gormLogLevel = logger.Warn default: gormLogLevel = logger.Info } gormCfg := &gorm.Config{ Logger: logger.Default.LogMode(gormLogLevel), } db, err := gorm.Open(mysql.Open(dsn), gormCfg) if err != nil { return nil, fmt.Errorf("连接数据库失败: %w", err) } sqlDB, err := db.DB() if err != nil { return nil, fmt.Errorf("获取底层 sql.DB 失败: %w", err) } // 连接池配置 sqlDB.SetMaxOpenConns(cfg.DBMaxOpenConns) sqlDB.SetMaxIdleConns(cfg.DBMaxIdleConns) sqlDB.SetConnMaxLifetime(time.Duration(cfg.DBConnMaxLife) * time.Second) // 测试连接 if err := sqlDB.Ping(); err != nil { return nil, fmt.Errorf("数据库 Ping 失败: %w", err) } DB = db return db, nil }