Files
lemma/server/internal/db/migrations.go
2025-02-22 22:32:38 +01:00

60 lines
1.6 KiB
Go

package db
import (
"embed"
"fmt"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/postgres"
"github.com/golang-migrate/migrate/v4/database/sqlite3"
"github.com/golang-migrate/migrate/v4/source/iofs"
)
//go:embed migrations/*.sql
var migrationsFS embed.FS
// Migrate applies all database migrations
func (db *database) Migrate() error {
log := getLogger().WithGroup("migrations")
log.Info("starting database migration")
sourceInstance, err := iofs.New(migrationsFS, "migrations")
if err != nil {
return fmt.Errorf("failed to create source instance: %w", err)
}
var m *migrate.Migrate
switch db.dbType {
case DBTypePostgres:
driver, err := postgres.WithInstance(db.DB, &postgres.Config{})
if err != nil {
return fmt.Errorf("failed to create postgres driver: %w", err)
}
m, err = migrate.NewWithInstance("iofs", sourceInstance, "postgres", driver)
if err != nil {
return fmt.Errorf("failed to create migrate instance: %w", err)
}
case DBTypeSQLite:
driver, err := sqlite3.WithInstance(db.DB, &sqlite3.Config{})
if err != nil {
return fmt.Errorf("failed to create sqlite driver: %w", err)
}
m, err = migrate.NewWithInstance("iofs", sourceInstance, "sqlite3", driver)
if err != nil {
return fmt.Errorf("failed to create migrate instance: %w", err)
}
default:
return fmt.Errorf("unsupported database driver: %s", db.dbType)
}
if err := m.Up(); err != nil && err != migrate.ErrNoChange {
return fmt.Errorf("failed to run migrations: %w", err)
}
log.Info("database migration completed")
return nil
}