85 lines
2.0 KiB
Go
85 lines
2.0 KiB
Go
|
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
|
||
|
}
|