package migrate import ( "fmt" "io/fs" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/postgres" "github.com/golang-migrate/migrate/v4/source/iofs" "gorm.io/gorm" ) func Run(db *gorm.DB, fsys fs.FS) error { return runWithTable(db, fsys, "schema_migrations") } func RunPlugin(db *gorm.DB, pluginName string, fsys fs.FS) error { if fsys == nil { return nil } table := fmt.Sprintf("schema_migrations_%s", pluginName) return runWithTable(db, fsys, table) } func runWithTable(db *gorm.DB, fsys fs.FS, table string) error { source, err := iofs.New(fsys, ".") if err != nil { return fmt.Errorf("create migration source: %w", err) } sqlDB, err := db.DB() if err != nil { return err } driver, err := postgres.WithInstance(sqlDB, &postgres.Config{ MigrationsTable: table, }) if err != nil { return fmt.Errorf("create migration driver: %w", err) } m, err := migrate.NewWithInstance("iofs", source, "postgres", driver) if err != nil { return fmt.Errorf("create migrator: %w", err) } if err := m.Up(); err != nil && err != migrate.ErrNoChange { return fmt.Errorf("run migrations (%s): %w", table, err) } return nil }