package mysql import ( "database/sql" "fmt" "time" ) type Config struct { Username string `koanf:"username"` Password string `koanf:"password"` Port int `koanf:"port"` Host string `koanf:"host"` DBName string `koanf:"db_name"` } type DB struct { config Config db *sql.DB } func (m *DB) Conn() *sql.DB { return m.db } // TODO: this temperary to ignore linter error (magic number). const ( dbMaxConnLifetime = time.Minute * 3 dbMaxOpenConns = 10 dbMaxIdleConns = 10 ) func New(config Config) *DB { // parseTime=true changes the output type of DATE and DATETIME values to time.Time // instead of []byte / string // The date or datetime like 0000-00-00 00:00:00 is converted into zero value of time.Time db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@(%s:%d)/%s?parseTime=true", config.Username, config.Password, config.Host, config.Port, config.DBName)) if err != nil { panic(fmt.Errorf("can't open mysql db: %w", err)) } // See "Important settings" section. db.SetConnMaxLifetime(dbMaxConnLifetime) db.SetMaxOpenConns(dbMaxOpenConns) db.SetMaxIdleConns(dbMaxIdleConns) return &DB{config: config, db: db} }