app-cloudep-wallet-service/pkg/lib/sql_client/mysql.go

85 lines
2.0 KiB
Go
Raw Permalink Normal View History

2025-04-16 09:24:54 +00:00
package sql_client
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
"log"
"os"
)
type MySQL struct {
mysqlConf gorm.Dialector
gormConf *gorm.Config
serverConf *Config
}
var defaultConfig = logger.Config{
SlowThreshold: defaultSlowSQLThreshold,
LogLevel: logger.Warn,
IgnoreRecordNotFoundError: false,
Colorful: true,
}
// New initializes a MysqlInit using the provided Config and options. If
// opts is not provided it will initialize MysqlInit with default configuration.
func New(conf *Config, opts ...Option) *MySQL {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local&interpolateParams=%t",
conf.User, conf.Password, conf.Host, conf.Port, conf.Database, conf.InterpolateParams)
loggerDefault := logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), defaultConfig)
mysqli := &MySQL{
mysqlConf: mysql.Open(dsn),
gormConf: &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true, // use singular table name
},
Logger: loggerDefault,
},
serverConf: conf,
}
for _, opt := range opts {
opt(mysqli)
}
return mysqli
}
// Conn initiates connection to database and return a gorm.DB.
func (mysqli *MySQL) Conn() (*gorm.DB, error) {
db, err := gorm.Open(mysqli.mysqlConf, mysqli.gormConf)
if err != nil {
return nil, fmt.Errorf("gorm open error: %w", err)
}
sqlDB, err := db.DB()
if err != nil {
return nil, fmt.Errorf("get connect pool error :%w", err)
}
maxIdleConns := defaultMaxIdleConns
if mysqli.serverConf.MaxIdleConns > 0 {
maxIdleConns = mysqli.serverConf.MaxIdleConns
}
maxOpenConns := defaultMaxOpenConns
if mysqli.serverConf.MaxOpenConns > 0 {
maxOpenConns = mysqli.serverConf.MaxOpenConns
}
maxLifeTime := defaultMaxLifeTime
if mysqli.serverConf.ConnMaxLifetime > 0 {
maxLifeTime = mysqli.serverConf.ConnMaxLifetime
}
sqlDB.SetMaxIdleConns(maxIdleConns)
sqlDB.SetMaxOpenConns(maxOpenConns)
sqlDB.SetConnMaxLifetime(maxLifeTime)
return db, nil
}