| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- package main
- import (
- "flag"
- "fmt"
- "log"
- "os"
- "iot-base-station/internal/config"
- "iot-base-station/pkg/database"
- "github.com/golang-migrate/migrate/v4"
- _ "github.com/golang-migrate/migrate/v4/database/postgres"
- _ "github.com/golang-migrate/migrate/v4/source/file"
- )
- func main() {
- var (
- action = flag.String("action", "", "Migration action: up, down, version, force")
- step = flag.Int("step", 0, "Number of steps to migrate (for up/down)")
- version = flag.Int("version", 0, "Target version (for force)")
- )
- flag.Parse()
- if *action == "" {
- fmt.Println("Usage: migrate -action=<up|down|version|force> [-step=N] [-version=N]")
- os.Exit(1)
- }
- // 加载配置
- cfg, err := config.LoadConfig("config/config.yaml")
- if err != nil {
- log.Fatalf("Failed to load config: %v", err)
- }
- // 连接数据库
- db, err := database.InitPostgres(cfg.Database.Postgres)
- if err != nil {
- log.Fatalf("Failed to connect to database: %v", err)
- }
- defer db.Close()
- // 创建迁移实例
- m, err := migrate.New(
- "file://migrations",
- fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable",
- cfg.Database.Postgres.User,
- cfg.Database.Postgres.Password,
- cfg.Database.Postgres.Host,
- cfg.Database.Postgres.Port,
- cfg.Database.Postgres.DBName,
- ),
- )
- if err != nil {
- log.Fatalf("Failed to create migration instance: %v", err)
- }
- defer m.Close()
- // 执行迁移
- switch *action {
- case "up":
- if *step > 0 {
- if err := m.Steps(*step); err != nil {
- log.Fatalf("Failed to migrate up: %v", err)
- }
- } else {
- if err := m.Up(); err != nil && err != migrate.ErrNoChange {
- log.Fatalf("Failed to migrate up: %v", err)
- }
- }
- fmt.Println("Migration up completed successfully")
- case "down":
- if *step > 0 {
- if err := m.Steps(-*step); err != nil {
- log.Fatalf("Failed to migrate down: %v", err)
- }
- } else {
- if err := m.Down(); err != nil && err != migrate.ErrNoChange {
- log.Fatalf("Failed to migrate down: %v", err)
- }
- }
- fmt.Println("Migration down completed successfully")
- case "version":
- version, dirty, err := m.Version()
- if err != nil {
- log.Fatalf("Failed to get version: %v", err)
- }
- fmt.Printf("Current version: %d, dirty: %v\n", version, dirty)
- case "force":
- if *version < 0 {
- log.Fatal("Version must be specified for force action")
- }
- if err := m.Force(*version); err != nil {
- log.Fatalf("Failed to force version: %v", err)
- }
- fmt.Printf("Forced version to %d\n", *version)
- default:
- log.Fatalf("Unknown action: %s", *action)
- }
- }
|