Files
overnight-trading-bot/cmd/migrate/main.go
T
2026-06-07 21:01:40 +00:00

58 lines
1.1 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"os"
"time"
"github.com/jmoiron/sqlx"
"overnight-trading-bot/internal/repository/mysql"
)
func main() {
if err := run(); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
}
func run() error {
dsn := flag.String("dsn", os.Getenv("DB_DSN"), "MySQL/MariaDB DSN")
direction := flag.String("direction", "up", "up or down")
flag.Parse()
if flag.NArg() > 0 {
*direction = flag.Arg(0)
}
if *dsn == "" {
return fmt.Errorf("DB_DSN is required")
}
db, err := sqlx.Open("mysql", *dsn)
if err != nil {
return fmt.Errorf("open db: %w", err)
}
defer func() {
_ = db.Close()
}()
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := db.PingContext(ctx); err != nil {
return fmt.Errorf("ping db: %w", err)
}
switch *direction {
case "up":
err = mysql.ApplyMigrations(ctx, db.DB)
case "down":
err = mysql.RollbackAll(db.DB)
default:
err = fmt.Errorf("unknown direction %q", *direction)
}
if err != nil {
return fmt.Errorf("migrate: %w", err)
}
fmt.Println("migrations applied")
return nil
}