package db import ( "context" "database/sql" "errors" "fmt" "github.com/go-sql-driver/mysql" ) func Open(dsn string) (*sql.DB, error) { db, err := sql.Open("mysql", dsn) if err != nil { return nil, fmt.Errorf("open db: %w", err) } if err := db.Ping(); err != nil { return nil, fmt.Errorf("ping db: %w", err) } return db, nil } func Migrate(ctx context.Context, db *sql.DB) error { for _, stmt := range statements { if _, err := db.ExecContext(ctx, stmt); err != nil { var mysqlErr *mysql.MySQLError if errors.As(err, &mysqlErr) && mysqlErr.Number == 1060 { continue // duplicate column — already exists } return fmt.Errorf("migrate: %w", err) } } return nil }