-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
executable file
·100 lines (83 loc) · 2.34 KB
/
main.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Package main, work as CLI for db migration.
// How to run this CLI:
// - go inside the directory, `cd database/migration`
// `go run main.go -dsn={value} -driver={value}`
package main
import (
"database/sql"
"flag"
"fmt"
"math"
"os"
"github.com/golang-migrate/migrate"
"github.com/golang-migrate/migrate/database/mysql"
_ "github.com/golang-migrate/migrate/source/file"
)
func main() {
flagReverse := flag.Bool("reverse", false, "To reverse migration")
flagStep := flag.Int("step", 0, "How many step(s) want when reversal migrate happens")
// TODO: add more description of usage this flag, if only want use the other driver(s)
flagDSN := flag.String("dsn",
"root:@tcp(localhost:3307)/poc-login-db?multiStatements=true",
"DSN for database. By default, the value DSN will be filled for mysql driver\n"+
"Format :\n"+
"- mysql/mariadb: user:password@tcp(host:port)/db_name",
)
flagDriver := flag.String(
"driver",
"mysql",
"Driver for database.\n"+
"List of drivers:\n"+
"- mysql (mariadb use this too)\n",
)
flag.Parse()
m, err := newMigrate(*flagDSN, *flagDriver)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
if *flagReverse {
err = down(m, *flagStep)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
os.Exit(0)
}
err = up(m)
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
os.Exit(0)
}
func newMigrate(dsn, driver string) (*migrate.Migrate, error) {
db, err := sql.Open(driver, dsn)
if err != nil {
return nil, fmt.Errorf("error when open [%s] connection: %v", driver, err)
}
// TODO: add switch for other driver(s)
dbd, err := mysql.WithInstance(db, &mysql.Config{})
if err != nil {
return nil, fmt.Errorf("error when create instance [%s]: %v", driver, err)
}
m, err := migrate.NewWithDatabaseInstance("file://./ddl", driver, dbd)
if err != nil {
return nil, fmt.Errorf("error when migrate instance [%s]: %v", driver, err)
}
return m, nil
}
func up(m *migrate.Migrate) error {
err := m.Up()
if err != nil {
return fmt.Errorf("error when migrate up: %v", err)
}
return nil
}
func down(m *migrate.Migrate, steps int) error {
err := m.Steps(int(math.Abs(float64(steps))) * -1)
if err != nil {
return fmt.Errorf("error when migrate down: %v", err)
}
return nil
}