package store import ( "database/sql" "embed" "errors" "fmt" "github.com/golang-migrate/migrate/v4" pgxmigrate "github.com/golang-migrate/migrate/v4/database/pgx/v5" "github.com/golang-migrate/migrate/v4/source/iofs" _ "github.com/jackc/pgx/v5/stdlib" ) //go:embed migrations/*.sql var migrationsFS embed.FS // Migrate wendet alle ausstehenden Migrationen aus migrations/ an. // Die Migrationen sind im Binary eingebettet (go:embed), damit Deklarix // weiterhin als einzelnes Binary lauffähig bleibt. func Migrate(databaseURL string) error { db, err := sql.Open("pgx", databaseURL) if err != nil { return fmt.Errorf("store: open db for migration: %w", err) } defer db.Close() driver, err := pgxmigrate.WithInstance(db, &pgxmigrate.Config{}) if err != nil { return fmt.Errorf("store: migration driver: %w", err) } source, err := iofs.New(migrationsFS, "migrations") if err != nil { return fmt.Errorf("store: migration source: %w", err) } m, err := migrate.NewWithInstance("iofs", source, "pgx5", driver) if err != nil { return fmt.Errorf("store: migrate init: %w", err) } defer m.Close() if err := m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("store: migrate up: %w", err) } return nil }