import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" _ "github.com/mattn/go-sqlite3" ) type Database struct { *sql.DB } func NewDatabase(config *Config) (*Database, error) { var dsn string if config.DB.Type == "mysql" { dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", config.DB.User, config.DB.Password, config.DB.Host, config.DB.Port, config.DB.Name) } else if config.DB.Type == "sqlite" { dsn = config.DB.Name + ".db" } else { return nil, fmt.Errorf("unsupported database type: %s", config.DB.Type) } db, err := sql.Open(config.DB.Type, dsn) if err != nil { return nil, err } if err := db.Ping(); err != nil { return nil, err } db.SetMaxOpenConns(25) db.SetMaxIdleConns(25) return &Database{DB: db}, nil } func (d *Database) Close() error { return d.DB.Close() }