package database import ( "fmt" "os" "time" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) var DB *gorm.DB // InitDB 初始化数据库连接 func InitDB() error { var err error // 从环境变量获取 MySQL 连接信息 dbHost := os.Getenv("DB_HOST") if dbHost == "" { dbHost = "localhost" } dbPort := os.Getenv("DB_PORT") if dbPort == "" { dbPort = "3306" } dbUser := os.Getenv("DB_USER") if dbUser == "" { dbUser = "root" } dbPassword := os.Getenv("DB_PASSWORD") if dbPassword == "" { dbPassword = "password" } dbName := os.Getenv("DB_NAME") if dbName == "" { dbName = "license_admin" } // 构建 DSN (Data Source Name) dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName) // 配置 GORM config := &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), } // 连接数据库,如果数据库不存在会自动创建(需要用户有 CREATE DATABASE 权限) DB, err = gorm.Open(mysql.Open(dsn), config) if err != nil { return fmt.Errorf("连接数据库失败: %v", err) } // 获取底层 SQL 连接以设置连接池 sqlDB, err := DB.DB() if err != nil { return fmt.Errorf("获取数据库连接失败: %v", err) } // 设置连接池参数 sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量 sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量 sqlDB.SetConnMaxLifetime(time.Hour) // 设置连接可复用的最大时间 // 测试数据库连接 if err = sqlDB.Ping(); err != nil { return fmt.Errorf("数据库连接测试失败: %v", err) } return nil }