Files
devsim/cmd/migrator/main.go
Aleksandr Trushkin 30e5968e03 support db migrations
2024-08-13 13:15:11 +03:00

79 lines
1.7 KiB
Go

package main
import (
"context"
"errors"
"fmt"
"log"
"os"
"os/signal"
"github.com/golang-migrate/migrate/v4"
// Use it to append postgres sql and file drivers.
_ "github.com/golang-migrate/migrate/v4/database/postgres"
_ "github.com/golang-migrate/migrate/v4/source/file"
)
func main() {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
err := app(ctx)
if err != nil {
log.Fatalf("unable to run app: %v", err)
}
}
func app(_ context.Context) (err error) {
const filepath = "file:///app/db/migrations"
pgdsn := os.Getenv("DEVSIM_PG_DSN")
if pgdsn == "" {
return nil
}
filedsn := os.Getenv("DEVSIM_PG_MIGRATION")
if filedsn == "" {
filedsn = filepath
}
log.Println("going to apply migrations from path: " + filedsn)
migrations, err := migrate.New(
filedsn,
pgdsn,
)
if err != nil {
return fmt.Errorf("making migrator: %w", err)
}
defer func() {
sourceErr, dbErr := migrations.Close()
err = errors.Join(err, sourceErr, dbErr)
}()
version, dirty, err := migrations.Version()
if errors.Is(err, migrate.ErrNilVersion) {
log.Println("no migrations applied to database")
} else if err != nil {
return fmt.Errorf("getting version: %w", err)
} else {
log.Printf("current migration version: %d (dirty: %t)", version, dirty)
}
err = migrations.Up()
if err != nil {
return fmt.Errorf("applying migrations: %w", err)
}
version, dirty, err = migrations.Version()
if errors.Is(err, migrate.ErrNilVersion) {
log.Println("no migrations applied to database")
} else if err != nil {
return fmt.Errorf("getting version: %w", err)
} else {
log.Printf("updated to migration version: %d (dirty: %t)", version, dirty)
}
return nil
}