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 }