package database import ( "fmt" "ssq-desk/internal/storage/models" "sync" "gorm.io/driver/mysql" "gorm.io/gorm" ) var ( mysqlDB *gorm.DB mysqlOnce sync.Once ) // MySQLConfig MySQL 连接配置 type MySQLConfig struct { Host string Port int User string Password string Database string } // GetMySQLConfig 获取 MySQL 配置(从配置文件或环境变量) func GetMySQLConfig() *MySQLConfig { return &MySQLConfig{ Host: "39.99.243.191", Port: 3306, User: "u_ssq", Password: "u_ssq@260106", Database: "ssq_dev", // 需要根据实际情况修改数据库名 } } // InitMySQL 初始化 MySQL 连接 func InitMySQL() (*gorm.DB, error) { var err error mysqlOnce.Do(func() { config := GetMySQLConfig() dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", config.User, config.Password, config.Host, config.Port, config.Database) mysqlDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { return } // 测试连接 sqlDB, err2 := mysqlDB.DB() if err2 != nil { err = err2 return } if err2 = sqlDB.Ping(); err2 != nil { err = err2 return } // 自动迁移表结构 err2 = mysqlDB.AutoMigrate( &models.SsqHistory{}, &models.Authorization{}, &models.Version{}, ) if err2 != nil { err = fmt.Errorf("MySQL 表迁移失败: %v", err2) return } }) if err != nil { return nil, fmt.Errorf("MySQL 连接初始化失败: %v", err) } return mysqlDB, nil } // GetMySQL 获取 MySQL 连接实例 func GetMySQL() *gorm.DB { if mysqlDB == nil { db, err := InitMySQL() if err != nil { return nil } return db } return mysqlDB }