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 }