Files
ssq-desk/internal/database/mysql.go
2026-01-14 14:17:38 +08:00

92 lines
1.7 KiB
Go

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
}