init: 1.0.0
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
package orm
|
||||
|
||||
import (
|
||||
"github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
func ParseDSN(dsn string) *Config {
|
||||
cfg, err := mysql.ParseDSN(dsn)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return &Config{
|
||||
Addr: cfg.Addr,
|
||||
Dbname: cfg.DBName,
|
||||
Username: cfg.User,
|
||||
Password: cfg.Passwd,
|
||||
Config: "charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai",
|
||||
MaxIdleConns: 10,
|
||||
MaxOpenConns: 10,
|
||||
SlowThreshold: 1000,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package orm
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/ppanel-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
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package orm
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestParseDSN(t *testing.T) {
|
||||
dsn := "root:mylove520@tcp(localhost:3306)/vpnboard"
|
||||
config := ParseDSN(dsn)
|
||||
if config == nil {
|
||||
t.Fatal("config is nil")
|
||||
}
|
||||
t.Log(config)
|
||||
}
|
||||
|
||||
func TestPing(t *testing.T) {
|
||||
dsn := "root:mylove520@tcp(localhost:3306)/vpnboard"
|
||||
status := Ping(dsn)
|
||||
t.Log(status)
|
||||
}
|
||||
Reference in New Issue
Block a user