Files
cmbuyer/admin/cmd/migrate/main.go
T

59 lines
1.4 KiB
Go
Raw Normal View History

2026-08-03 18:37:42 +08:00
package main
import (
"context"
"errors"
"flag"
"fmt"
"io"
"log"
"os"
"cmbuyer/admin/internal/migrations"
"cmbuyer/admin/internal/storage/sqlite"
)
func main() {
if err := run(context.Background(), os.Args[1:], os.Stderr); err != nil {
log.Print(err)
os.Exit(1)
}
}
func run(ctx context.Context, args []string, stderr io.Writer) error {
flags := flag.NewFlagSet("migrate", flag.ContinueOnError)
flags.SetOutput(stderr)
databaseSource := flags.String("database", "", "SQLite data source")
migrationDirectory := flags.String("dir", "migrations", "migration directory")
if err := flags.Parse(args); err != nil {
return err
}
if *databaseSource == "" {
return errors.New("-database is required")
}
if flags.NArg() != 1 {
return fmt.Errorf("usage: migrate -database <sqlite-data-source> [-dir <migration-directory>] <up|down|status>")
}
command := flags.Arg(0)
if command != "up" && command != "down" && command != "status" {
return fmt.Errorf("unsupported migration command %q", command)
}
database, err := sqlite.Open(*databaseSource)
if err != nil {
return fmt.Errorf("open SQLite database: %w", err)
}
defer func() {
if err := database.Close(); err != nil {
log.Printf("close SQLite database: %v", err)
}
}()
if err := migrations.Run(ctx, database, *migrationDirectory, command); err != nil {
return fmt.Errorf("run migrations: %w", err)
}
return nil
}