package database import ( "errors" "fmt" "time" "github.com/spf13/cast" "gorm.io/driver/mysql" "gorm.io/gorm" ) func New(config Config) (*gorm.DB, error) { db, err := config.Build(&gorm.Config{}) if err != nil { return nil, err } sqldb, err := db.DB() if err != nil { return nil, err } if config.Has("max_open_conns") { sqldb.SetMaxOpenConns(config.GetInt("max_open_conns")) } if config.Has("max_idle_conns") { sqldb.SetMaxIdleConns(config.GetInt("max_idle_conns")) } if config.Has("conn_max_idle_time") { sqldb.SetConnMaxIdleTime(config.GetDuration("conn_max_idle_time") * time.Second) } if config.Has("conn_max_lifetime") { sqldb.SetConnMaxLifetime(config.GetDuration("conn_max_lifetime") * time.Second) } return db, nil } type Config map[string]interface{} func (cfg Config) GetString(key string) string { return cast.ToString(cfg[key]) } func (cfg Config) GetInt(key string) int { return cast.ToInt(cfg[key]) } func (cfg Config) GetDuration(key string) time.Duration { return cast.ToDuration(cfg[key]) } func (cfg Config) Has(key string) bool { _, ok := cfg[key] return ok } func (cfg Config) Build(opts ...gorm.Option) (*gorm.DB, error) { switch cfg.GetString("driver") { case "mysql": dsn := cfg.GetString("dsn") if dsn == "" { dsn = fmt.Sprintf( "%v:%v@tcp(%v:%v)/%v?charset=%v&parseTime=True&loc=Local", cfg.GetString("username"), cfg.GetString("password"), cfg.GetString("host"), cfg.GetInt("port"), cfg.GetString("database"), cfg.GetString("charset"), ) } return gorm.Open(mysql.Open(dsn), opts...) default: return nil, errors.New("database driver not supported") } }