mirror of
https://github.com/renorris/openfsd
synced 2026-03-22 06:25:35 +08:00
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package db
|
|
|
|
import (
|
|
"database/sql"
|
|
"embed"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/golang-migrate/migrate/v4"
|
|
"github.com/golang-migrate/migrate/v4/database"
|
|
"github.com/golang-migrate/migrate/v4/database/postgres"
|
|
migrateSqlite "github.com/golang-migrate/migrate/v4/database/sqlite"
|
|
"github.com/golang-migrate/migrate/v4/source/iofs"
|
|
"github.com/lib/pq" // PostgreSQL driver
|
|
"modernc.org/sqlite" // SQLite driver
|
|
)
|
|
|
|
//go:embed migrations
|
|
var migrationsFS embed.FS
|
|
|
|
// Migrate applies database migrations.
|
|
func Migrate(db *sql.DB) (err error) {
|
|
var migrationPath string
|
|
var driver database.Driver
|
|
var dbType string
|
|
|
|
switch db.Driver().(type) {
|
|
case *pq.Driver:
|
|
dbType = "postgres"
|
|
migrationPath = "migrations/postgres"
|
|
if driver, err = postgres.WithInstance(db, &postgres.Config{}); err != nil {
|
|
return
|
|
}
|
|
case *sqlite.Driver:
|
|
dbType = "sqlite"
|
|
migrationPath = "migrations/sqlite"
|
|
if driver, err = migrateSqlite.WithInstance(db, &migrateSqlite.Config{}); err != nil {
|
|
return
|
|
}
|
|
default:
|
|
return fmt.Errorf("unsupported database type")
|
|
}
|
|
|
|
d, err := iofs.New(migrationsFS, migrationPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
m, err := migrate.NewWithInstance("iofs", d, dbType, driver)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = m.Up()
|
|
if err != nil && !errors.Is(err, migrate.ErrNoChange) {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|