-
Notifications
You must be signed in to change notification settings - Fork 1
/
migrate_command.go
80 lines (67 loc) · 1.92 KB
/
migrate_command.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main
import (
"fmt"
"github.com/appuio/appuio-cloud-reporting/pkg/db"
"github.com/urfave/cli/v2"
)
type migrateCommand struct {
ShowPending bool
DatabaseURL string
SeedEnabled bool
}
var migrateCommandName = "migrate"
func newMigrateCommand() *cli.Command {
command := &migrateCommand{}
return &cli.Command{
Name: migrateCommandName,
Usage: "Perform database migrations",
Before: command.before,
Action: command.execute,
Flags: []cli.Flag{
&cli.BoolFlag{Name: "show-pending", Usage: "Shows pending migrations and exits", EnvVars: envVars("SHOW_PENDING"), Destination: &command.ShowPending},
&cli.BoolFlag{Name: "seed", Usage: "Seeds database with initial data and exits", EnvVars: envVars("SEED"), Destination: &command.SeedEnabled},
newDbURLFlag(&command.DatabaseURL),
},
}
}
func (cmd *migrateCommand) before(ctx *cli.Context) error {
return LogMetadata(ctx)
}
func (cmd *migrateCommand) execute(context *cli.Context) error {
log := AppLogger(context.Context).WithName(migrateCommandName)
log.V(1).Info("Opening database connection", "url", cmd.DatabaseURL)
rdb, err := db.Open(cmd.DatabaseURL)
if err != nil {
return fmt.Errorf("could not open database connection: %w", err)
}
if cmd.SeedEnabled {
log.V(1).Info("Seeding DB...")
err := db.Seed(rdb)
if err != nil {
return fmt.Errorf("error seeding database: %w", err)
}
log.Info("Done seeding")
return nil
}
if cmd.ShowPending {
log.V(1).Info("Showing pending DB migrations")
pm, err := db.Pending(rdb)
if err != nil {
return fmt.Errorf("error showing pending migrations: %w", err)
}
for _, p := range pm {
fmt.Println(p.Name)
}
// non-zero exit code could be used in scripts
if len(pm) > 0 {
cli.Exit("Pending migrations found.", 1)
}
return nil
}
log.V(1).Info("Start DB migrations")
err = db.Migrate(rdb)
if err != nil {
return fmt.Errorf("could not migrate database: %w", err)
}
return nil
}