-
Notifications
You must be signed in to change notification settings - Fork 50
/
migrations.go
65 lines (50 loc) · 1.69 KB
/
migrations.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package db
import (
"fmt"
"strings"
"time"
"github.com/golang-migrate/migrate/v4"
_ "github.com/golang-migrate/migrate/v4/source/file"
"github.com/jmoiron/sqlx"
"github.com/justtrackio/gosoline/pkg/log"
)
type MigrationSettings struct {
Application string `cfg:"application" default:"{app_name}"`
Path string `cfg:"path"`
PrefixedTables bool `cfg:"prefixed_tables" default:"false"`
Enabled bool `cfg:"enabled" default:"false"`
}
func runMigrations(logger log.Logger, settings Settings, db *sqlx.DB) error {
if !settings.Migrations.Enabled || settings.Migrations.Path == "" {
return nil
}
driverFactory, err := GetDriverFactory(settings.Driver)
if err != nil {
return fmt.Errorf("could not get driver factory for %s: %w", settings.Driver, err)
}
migrationsTable := "schema_migrations"
if settings.Migrations.PrefixedTables {
application := strings.ToLower(settings.Migrations.Application)
application = strings.Replace(application, "-", "_", -1)
migrationsTable = fmt.Sprintf("%s_schema_migrations", application)
}
driver, err := driverFactory.GetMigrationDriver(db.DB, settings.Uri.Database, migrationsTable)
if err != nil {
return fmt.Errorf("could not get migration driver: %w", err)
}
m, err := migrate.NewWithDatabaseInstance(settings.Migrations.Path, settings.Driver, driver)
if err != nil {
return fmt.Errorf("could not initialize migrator for db migrations: %w", err)
}
start := time.Now()
err = m.Up()
if err == migrate.ErrNoChange {
logger.Info("no db migrations to run")
return nil
}
if err != nil {
return fmt.Errorf("could not run db migrations: %w", err)
}
logger.Info("migrated db in %s", time.Since(start))
return nil
}