All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 6m34s
feat(middleware): 区分Redis中session不存在的错误情况 在MySQL连接配置中添加SetConnMaxIdleTime和SetConnMaxLifetime设置 在认证中间件中区分Redis返回的key不存在错误和其他错误
75 lines
1.8 KiB
Go
75 lines
1.8 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)
|
|
sqldb.SetConnMaxIdleTime(5 * time.Minute)
|
|
sqldb.SetConnMaxLifetime(30 * time.Minute)
|
|
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
|
|
}
|