98 lines
2.4 KiB
Go
98 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"58team_blog/internal/infrastructure"
|
|
"database/sql"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/golang-migrate/migrate"
|
|
"github.com/golang-migrate/migrate/database/postgres"
|
|
_ "github.com/golang-migrate/migrate/source/file"
|
|
_ "github.com/lib/pq"
|
|
)
|
|
|
|
func main() {
|
|
var command = flag.String("command", "up", "Migration command: up, down, version, force.")
|
|
var steps = flag.Int("steps", -1, "Number of migration steps (for up/down commands)")
|
|
var version = flag.Int("version", -1, "Target version (for force command)")
|
|
|
|
config, err := infrastructure.LoadConfig()
|
|
if err != nil {
|
|
log.Fatal("Cannot load config file: ", err)
|
|
}
|
|
|
|
DbUrl := "postgres://" + config.DBUser + ":" + config.DBPass +
|
|
"@" + config.DBHost + ":" + config.DBPort + "/" + config.DBName + "?sslmode=disable"
|
|
fmt.Println(DbUrl)
|
|
|
|
db, err := sql.Open("postgres", DbUrl)
|
|
if err != nil {
|
|
log.Fatal("Failed to connect to database:", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
driver, err := postgres.WithInstance(db, &postgres.Config{})
|
|
if err != nil {
|
|
log.Fatal("Failed to create database driver:", err)
|
|
}
|
|
|
|
m, err := migrate.NewWithDatabaseInstance("file://./migrations", "postgres", driver)
|
|
if err != nil {
|
|
log.Fatal("Failed to create migrate instance:", err)
|
|
}
|
|
defer m.Close()
|
|
|
|
switch *command {
|
|
case "up":
|
|
if *steps > 0 {
|
|
err = m.Steps(*steps)
|
|
} else {
|
|
err = m.Up()
|
|
}
|
|
if err != nil && err != migrate.ErrNoChange {
|
|
log.Fatal("Migration up failed:", err)
|
|
}
|
|
if err == migrate.ErrNoChange {
|
|
fmt.Println("No migrations to apply")
|
|
} else {
|
|
fmt.Println("Migrations applied successfully")
|
|
}
|
|
|
|
case "down":
|
|
if *steps > 0 {
|
|
err = m.Steps(-*steps)
|
|
} else {
|
|
err = m.Down()
|
|
}
|
|
if err != nil && err != migrate.ErrNoChange {
|
|
log.Fatal("Migration down failed:", err)
|
|
}
|
|
if err == migrate.ErrNoChange {
|
|
fmt.Println("No migrations to rollback")
|
|
} else {
|
|
fmt.Println("Migrations rolled back successfully")
|
|
}
|
|
|
|
case "version":
|
|
version, dirty, err := m.Version()
|
|
if err != nil {
|
|
log.Fatal("Failed to get version:", err)
|
|
}
|
|
fmt.Printf("Current version: %d (dirty: %v)\n", version, dirty)
|
|
|
|
case "force":
|
|
if *version < 0 {
|
|
log.Fatal("Version is required for force command. Use -version flag")
|
|
}
|
|
err = m.Force(*version)
|
|
if err != nil {
|
|
log.Fatal("Force migration failed:", err)
|
|
}
|
|
fmt.Printf("Forced migration to version %d\n", *version)
|
|
|
|
default:
|
|
log.Fatal("Unknown command:", *command)
|
|
}
|
|
}
|