package database import ( "context" "database/sql" "fmt" "time" "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql" "github.com/luxsin/app-api/internal/config" ) func Open(cfg config.DatabaseConfig) (*sql.DB, error) { mc := mysql.Config{ User: cfg.User, Passwd: cfg.Password, Net: "tcp", Addr: fmt.Sprintf("%s:%d", cfg.Host, cfg.Port), DBName: cfg.Name, Params: map[string]string{ "charset": "utf8mb4", "parseTime": "True", "loc": "Local", "allowNativePasswords": "true", }, } db, err := sql.Open("mysql", mc.FormatDSN()) if err != nil { return nil, fmt.Errorf("open mysql: %w", err) } db.SetMaxOpenConns(25) db.SetMaxIdleConns(5) db.SetConnMaxLifetime(5 * time.Minute) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := db.PingContext(ctx); err != nil { _ = db.Close() return nil, fmt.Errorf("ping mysql: %w", err) } return db, nil }