main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "os"
  7. "iot-base-station/internal/config"
  8. "iot-base-station/pkg/database"
  9. "github.com/golang-migrate/migrate/v4"
  10. _ "github.com/golang-migrate/migrate/v4/database/postgres"
  11. _ "github.com/golang-migrate/migrate/v4/source/file"
  12. )
  13. func main() {
  14. var (
  15. action = flag.String("action", "", "Migration action: up, down, version, force")
  16. step = flag.Int("step", 0, "Number of steps to migrate (for up/down)")
  17. version = flag.Int("version", 0, "Target version (for force)")
  18. )
  19. flag.Parse()
  20. if *action == "" {
  21. fmt.Println("Usage: migrate -action=<up|down|version|force> [-step=N] [-version=N]")
  22. os.Exit(1)
  23. }
  24. // 加载配置
  25. cfg, err := config.LoadConfig("config/config.yaml")
  26. if err != nil {
  27. log.Fatalf("Failed to load config: %v", err)
  28. }
  29. // 连接数据库
  30. db, err := database.InitPostgres(cfg.Database.Postgres)
  31. if err != nil {
  32. log.Fatalf("Failed to connect to database: %v", err)
  33. }
  34. defer db.Close()
  35. // 创建迁移实例
  36. m, err := migrate.New(
  37. "file://migrations",
  38. fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable",
  39. cfg.Database.Postgres.User,
  40. cfg.Database.Postgres.Password,
  41. cfg.Database.Postgres.Host,
  42. cfg.Database.Postgres.Port,
  43. cfg.Database.Postgres.DBName,
  44. ),
  45. )
  46. if err != nil {
  47. log.Fatalf("Failed to create migration instance: %v", err)
  48. }
  49. defer m.Close()
  50. // 执行迁移
  51. switch *action {
  52. case "up":
  53. if *step > 0 {
  54. if err := m.Steps(*step); err != nil {
  55. log.Fatalf("Failed to migrate up: %v", err)
  56. }
  57. } else {
  58. if err := m.Up(); err != nil && err != migrate.ErrNoChange {
  59. log.Fatalf("Failed to migrate up: %v", err)
  60. }
  61. }
  62. fmt.Println("Migration up completed successfully")
  63. case "down":
  64. if *step > 0 {
  65. if err := m.Steps(-*step); err != nil {
  66. log.Fatalf("Failed to migrate down: %v", err)
  67. }
  68. } else {
  69. if err := m.Down(); err != nil && err != migrate.ErrNoChange {
  70. log.Fatalf("Failed to migrate down: %v", err)
  71. }
  72. }
  73. fmt.Println("Migration down completed successfully")
  74. case "version":
  75. version, dirty, err := m.Version()
  76. if err != nil {
  77. log.Fatalf("Failed to get version: %v", err)
  78. }
  79. fmt.Printf("Current version: %d, dirty: %v\n", version, dirty)
  80. case "force":
  81. if *version < 0 {
  82. log.Fatal("Version must be specified for force action")
  83. }
  84. if err := m.Force(*version); err != nil {
  85. log.Fatalf("Failed to force version: %v", err)
  86. }
  87. fmt.Printf("Forced version to %d\n", *version)
  88. default:
  89. log.Fatalf("Unknown action: %s", *action)
  90. }
  91. }