mycommon/mymysql/mysql.go

155 lines
3.1 KiB
Go
Raw Normal View History

2023-01-15 00:21:08 +08:00
package mymysql
import (
"database/sql"
"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
instanceMap = make(map[string]*MyDB)
2023-01-15 00:21:08 +08:00
)
type (
MyDB struct {
2023-03-20 20:41:36 +08:00
db *gorm.DB
sqlDb *sql.DB
2023-01-15 00:21:08 +08:00
}
Config struct {
Dsn string
MaxOpenConn int
MaxIdleConn int
MaxIdleTime string
MaxLifeTime string
Debug bool
GormLogger gormLogger.Interface
}
)
2023-03-20 20:41:36 +08:00
func Instance(key ...string) *MyDB {
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
}
func NewDefault(config *Config) (*MyDB, error) {
return New(DefaultKey, config)
}
func New(key string, config *Config) (*MyDB, 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
myDb := &MyDB{
db: db,
sqlDb: sqlDb,
}
instanceMap[key] = myDb
return myDb, 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)
}
func (m *MyDB) Close() {
2023-03-20 20:41:36 +08:00
if m.sqlDb != nil {
m.sqlDb.Close()
2023-01-15 00:21:08 +08:00
}
}
2023-03-20 20:41:36 +08:00
func (m *MyDB) DB() *gorm.DB {
return m.db
}
func (m *MyDB) SqlDB() *sql.DB {
return m.sqlDb
}