mycommon/mymysql/mysql.go

144 lines
3.0 KiB
Go
Raw Normal View History

2023-01-15 00:21:08 +08:00
package mymysql
import (
"fmt"
"git.makemake.in/test/mycommon/mylog"
"gorm.io/driver/mysql"
"gorm.io/gorm"
gormLogger "gorm.io/gorm/logger"
"time"
)
2023-03-20 20:41:36 +08:00
const DefaultKey = "default"
2023-01-15 00:21:08 +08:00
var (
DefaultConfig = &Config{
Dsn: "root:root@tcp(127.0.0.1:3306)/?loc=Local&charset=utf8mb4&parseTime=true",
MaxOpenConn: 32,
MaxIdleConn: 16,
MaxLifeTime: "1h",
MaxIdleTime: "10m",
Debug: true,
GormLogger: gormLogger.Default.LogMode(gormLogger.Info),
}
2023-03-20 20:41:36 +08:00
2023-03-20 20:53:18 +08:00
instanceMap = make(map[string]*gorm.DB)
2023-01-15 00:21:08 +08:00
)
type (
Config struct {
Dsn string
MaxOpenConn int
MaxIdleConn int
MaxIdleTime string
MaxLifeTime string
Debug bool
GormLogger gormLogger.Interface
}
)
2023-03-20 20:53:18 +08:00
func Instance(key ...string) *gorm.DB {
2023-03-20 20:41:36 +08:00
var key0 string
if len(key) > 0 {
key0 = key[0]
} else {
key0 = DefaultKey
}
instance, ok := instanceMap[key0]
if !ok {
panic(fmt.Errorf("%s not config", key))
}
return instance
}
2023-03-20 20:53:18 +08:00
func NewDefault(config *Config) (*gorm.DB, error) {
2023-03-20 20:41:36 +08:00
return New(DefaultKey, config)
}
2023-03-20 20:53:18 +08:00
func New(key string, config *Config) (*gorm.DB, error) {
2023-01-15 00:21:08 +08:00
var (
maxLifeTime, _ = time.ParseDuration(DefaultConfig.MaxLifeTime)
maxIdleTime, _ = time.ParseDuration(DefaultConfig.MaxIdleTime)
logger gormLogger.Interface
)
if config.MaxOpenConn <= 0 {
config.MaxOpenConn = DefaultConfig.MaxOpenConn
}
if config.MaxIdleConn <= 0 {
config.MaxIdleConn = DefaultConfig.MaxIdleConn
}
if config.MaxLifeTime != "" {
t, err := time.ParseDuration(config.MaxLifeTime)
if err != nil {
return nil, fmt.Errorf("parse MaxLifeTime err: %s\n", err)
}
maxLifeTime = t
}
if config.MaxIdleTime != "" {
t, err := time.ParseDuration(config.MaxIdleTime)
if err != nil {
return nil, fmt.Errorf("parse MaxIdleTime err: %s\n", err)
}
maxIdleTime = t
}
if config.GormLogger == nil {
level := gormLogger.Warn
if config.Debug {
level = gormLogger.Info
}
logger = DefaultGormLogger(level)
}
db, err := gorm.Open(mysql.Open(config.Dsn), &gorm.Config{
SkipDefaultTransaction: true,
Logger: logger,
})
if err != nil {
return nil, fmt.Errorf("connect mysql err: %s", err)
}
sqlDb, _ := db.DB()
sqlDb.SetMaxOpenConns(config.MaxOpenConn)
sqlDb.SetMaxIdleConns(config.MaxIdleConn)
sqlDb.SetConnMaxLifetime(maxLifeTime)
sqlDb.SetConnMaxIdleTime(maxIdleTime)
2023-03-20 20:41:36 +08:00
2023-03-20 20:53:18 +08:00
instanceMap[key] = db
return db, nil
2023-01-15 00:21:08 +08:00
}
func DefaultGormLogger(level gormLogger.LogLevel) gormLogger.Interface {
return gormLogger.New(mylog.NewLogger("gorm", mylog.DefaultConfig), gormLogger.Config{
SlowThreshold: time.Second * 2,
Colorful: true,
IgnoreRecordNotFoundError: false,
ParameterizedQueries: false,
LogLevel: level,
})
}
func NewGormLogger(writer gormLogger.Writer, gormLoggerConfig gormLogger.Config) gormLogger.Interface {
return gormLogger.New(writer, gormLoggerConfig)
}
2023-03-20 20:53:18 +08:00
func Close(key string) {
db, _ := Instance(key).DB()
db.Close()
2023-03-20 20:41:36 +08:00
}
2023-03-20 20:53:18 +08:00
func CloseAll() {
for _, v := range instanceMap {
db, _ := v.DB()
db.Close()
}
2023-03-20 20:41:36 +08:00
}