-
Notifications
You must be signed in to change notification settings - Fork 162
Expand file tree
/
Copy pathmigrate.go
More file actions
91 lines (81 loc) · 2.01 KB
/
migrate.go
File metadata and controls
91 lines (81 loc) · 2.01 KB
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
package admin
import (
"errors"
"github.com/go-gormigrate/gormigrate/v2"
"gorm.io/gorm"
)
// AddMigration add *gormigrate.Migration
func (ws *WebServe) AddMigration(m ...*gormigrate.Migration) {
ws.items = append(ws.items, m...)
}
// MigrationLen length of MigrationCollection
func (ws *WebServe) MigrationLen() int {
return len(ws.items)
}
// Refresh refresh migration
func (mc *WebServe) Refresh() error {
if mc.getFirstMigration() == "" {
return nil
}
err := mc.rollbackTo(mc.getFirstMigration())
if !errors.Is(err, gormigrate.ErrMigrationIDDoesNotExist) && err != nil {
return err
}
return mc.Migrate()
}
// rollbackTo roolback migration to migrationId
func (ws *WebServe) rollbackTo(migrationId string) error {
return ws.m.RollbackTo(migrationId)
}
// Rollback roolback migrations
func (ws *WebServe) Rollback(migrationId string) error {
if ws.MigrationLen() == 0 {
return nil
}
if migrationId == "" {
err := ws.rollbackLast()
if !errors.Is(err, gormigrate.ErrMigrationIDDoesNotExist) && err != nil {
return err
}
return nil
}
err := ws.rollbackTo(migrationId)
if !errors.Is(err, gormigrate.ErrMigrationIDDoesNotExist) && err != nil {
return err
}
return nil
}
// rollbackLast roolback the lasted migration
func (ws *WebServe) rollbackLast() error {
return ws.m.RollbackLast()
}
// Migrate exec migration cmd
func (ws *WebServe) Migrate() error {
// add migrations
ws.AddMigration(
&gormigrate.Migration{
ID: "init_system",
Migrate: func(tx *gorm.DB) error {
return tx.AutoMigrate(&Router{}, &Menu{})
},
Rollback: func(tx *gorm.DB) error {
return tx.Migrator().DropTable(new(Router).TableName(), new(Menu).TableName())
},
},
// add more migrations
)
if ws.m == nil {
ws.m = gormigrate.New(ws.db, gormigrate.DefaultOptions, ws.items)
}
if err := ws.m.Migrate(); err != nil {
return err
}
return nil
}
// getFirstMigration get first migration's id
func (ws *WebServe) getFirstMigration() string {
if ws.MigrationLen() == 0 {
return ""
}
return ws.items[0].ID
}