support db migrations
This commit is contained in:
78
cmd/migrator/main.go
Normal file
78
cmd/migrator/main.go
Normal file
@ -0,0 +1,78 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user