This commit is contained in:
2023-01-15 00:21:08 +08:00
commit 0fdfb59809
15 changed files with 1374 additions and 0 deletions

119
mymysql/mysql.go Normal file
View File

@@ -0,0 +1,119 @@
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"
)
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),
}
)
type (
MyDB struct {
DB *gorm.DB
SqlDB *sql.DB
}
Config struct {
Dsn string
MaxOpenConn int
MaxIdleConn int
MaxIdleTime string
MaxLifeTime string
Debug bool
GormLogger gormLogger.Interface
}
)
func New(config *Config) (*MyDB, error) {
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)
return &MyDB{
DB: db,
SqlDB: sqlDb,
}, nil
}
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() {
if m.SqlDB != nil {
m.SqlDB.Close()
}
}

33
mymysql/mysql_test.go Normal file
View File

@@ -0,0 +1,33 @@
package mymysql
import (
"fmt"
"testing"
)
func TestMysql(t *testing.T) {
myDB, err := New(&Config{
Dsn: "root:root@tcp(127.0.0.1:3306)/site?loc=Local&charset=utf8mb4&writeTimeout=3s&readTimeout=3s&timeout=2s&parseTime=true",
MaxOpenConn: 16,
MaxIdleConn: 4,
MaxIdleTime: "5m",
MaxLifeTime: "30m",
Debug: false,
GormLogger: nil,
})
if err != nil {
fmt.Println(err)
return
}
defer myDB.Close()
var res = make(map[string]interface{})
err = myDB.DB.Table("image").Limit(1).Take(&res).Error
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%+v\n", res)
}