ario_server/pkg/orm/mysql.go
shanshanzhong c582087c0f
Some checks failed
Build docker and publish / build (20.15.1) (push) Failing after 6m27s
refactor: 更新项目引用路径从perfect-panel/ppanel-server到perfect-panel/server
feat: 添加版本和构建时间变量
fix: 修正短信队列类型注释错误
style: 清理未使用的代码和测试文件
docs: 更新安装文档中的下载链接
chore: 迁移数据库脚本添加日志和订阅配置
2025-10-13 01:33:03 -07:00

73 lines
1.7 KiB
Go

package orm
import (
"errors"
"fmt"
"time"
"github.com/perfect-panel/server/pkg/logger"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
type Config struct {
Addr string `yaml:"Addr"`
Username string `yaml:"Username"`
Password string `yaml:"Password"`
Dbname string `yaml:"Dbname"`
Config string `yaml:"Config" default:"charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai"`
MaxIdleConns int `yaml:"MaxIdleConns" default:"10"`
MaxOpenConns int `yaml:"MaxOpenConns" default:"10"`
SlowThreshold int64 `yaml:"SlowThreshold" default:"1000"`
}
type Mysql struct {
Config Config
}
func (m *Mysql) Dsn() string {
return m.Config.Username + ":" + m.Config.Password + "@tcp(" + m.Config.Addr + ")/" + m.Config.Dbname + "?" + m.Config.Config
}
func (m *Mysql) GetSlowThreshold() time.Duration {
return time.Duration(m.Config.SlowThreshold) * time.Millisecond
}
func (m *Mysql) GetColorful() bool {
return true
}
func ConnectMysql(m Mysql) (*gorm.DB, error) {
if m.Config.Dbname == "" {
return nil, errors.New("database name is empty")
}
mysqlCfg := mysql.Config{
DSN: m.Dsn(),
}
db, err := gorm.Open(mysql.New(mysqlCfg), &gorm.Config{
Logger: new(logger.GormLogger),
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
})
if err != nil {
return nil, err
} else {
sqldb, _ := db.DB()
sqldb.SetMaxIdleConns(m.Config.MaxIdleConns)
sqldb.SetMaxOpenConns(m.Config.MaxOpenConns)
return db, nil
}
}
func Ping(dsn string) bool {
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Printf("connect mysql failed, err: %v\n", err.Error())
return false
}
sqlDB, _ := db.DB()
return sqlDB.Ping() == nil
}