Added migrations

This commit is contained in:
KamilM1205 2025-09-20 18:16:26 +04:00
parent 4a16acc87e
commit 5b18009658
34 changed files with 929 additions and 154 deletions

98
migrate.go Normal file
View file

@ -0,0 +1,98 @@
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)
}
}