Initial commit
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
package migration
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/go-gormigrate/gormigrate/v2"
|
||||
"pet-house.com/core/seed"
|
||||
"pet-house.com/core/server/database"
|
||||
)
|
||||
|
||||
// MigrationCmd migration cmd
|
||||
// MigrationCollection migration collections
|
||||
// SeedCollection data seed collection
|
||||
type MigrationCmd struct {
|
||||
MigrationCollection []*gormigrate.Migration
|
||||
SeedCollection []seed.SeedFunc
|
||||
}
|
||||
|
||||
// New MigrationCmd
|
||||
func New() *MigrationCmd {
|
||||
mc := &MigrationCmd{
|
||||
MigrationCollection: nil,
|
||||
SeedCollection: nil,
|
||||
}
|
||||
|
||||
return mc
|
||||
}
|
||||
|
||||
// AddMigration add *gormigrate.Migration
|
||||
func (mc *MigrationCmd) AddMigration(m ...*gormigrate.Migration) {
|
||||
mc.MigrationCollection = append(mc.MigrationCollection, m...)
|
||||
}
|
||||
|
||||
// MigrationLen length of MigrationCollection
|
||||
func (mc *MigrationCmd) MigrationLen() int {
|
||||
return len(mc.MigrationCollection)
|
||||
}
|
||||
|
||||
// AddSeed add SeedFunc
|
||||
func (mc *MigrationCmd) AddSeed(sf ...seed.SeedFunc) {
|
||||
mc.SeedCollection = append(mc.SeedCollection, sf...)
|
||||
}
|
||||
|
||||
// SeedlLen length of SeedCollection
|
||||
func (mc *MigrationCmd) SeedlLen() int {
|
||||
return len(mc.SeedCollection)
|
||||
}
|
||||
|
||||
// Refresh refresh migration
|
||||
func (mc *MigrationCmd) Refresh() error {
|
||||
if mc.getFirstMigration() == "" {
|
||||
return nil
|
||||
}
|
||||
err := mc.rollbackTo(mc.getFirstMigration())
|
||||
if !errors.Is(gormigrate.ErrMigrationIDDoesNotExist, err) && err != nil {
|
||||
return err
|
||||
}
|
||||
return mc.Migrate()
|
||||
}
|
||||
|
||||
// rollbackTo roolback migration to migrationId
|
||||
func (mc *MigrationCmd) rollbackTo(migrationId string) error {
|
||||
return mc.gormigrate().RollbackTo(migrationId)
|
||||
}
|
||||
|
||||
// Rollback roolback migrations
|
||||
func (mc *MigrationCmd) Rollback(migrationId string) error {
|
||||
if mc.MigrationLen() == 0 {
|
||||
return nil
|
||||
}
|
||||
if migrationId == "" {
|
||||
err := mc.rollbackLast()
|
||||
if !errors.Is(gormigrate.ErrMigrationIDDoesNotExist, err) && err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
err := mc.rollbackTo(migrationId)
|
||||
if !errors.Is(gormigrate.ErrMigrationIDDoesNotExist, err) && err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// rollbackLast roolback the lasted migration
|
||||
func (mc *MigrationCmd) rollbackLast() error {
|
||||
return mc.gormigrate().RollbackLast()
|
||||
}
|
||||
|
||||
// Migrate exec migration cmd
|
||||
func (mc *MigrationCmd) Migrate() error {
|
||||
m := mc.gormigrate()
|
||||
err := m.Migrate()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Seed seed data into database
|
||||
func (mc *MigrationCmd) Seed() error {
|
||||
if mc.SeedCollection == nil {
|
||||
return nil
|
||||
}
|
||||
return seed.Seed(mc.SeedCollection...)
|
||||
}
|
||||
|
||||
// getFirstMigration get first migration's id
|
||||
func (mc *MigrationCmd) getFirstMigration() string {
|
||||
if mc.MigrationLen() == 0 {
|
||||
return ""
|
||||
}
|
||||
return mc.MigrationCollection[0].ID
|
||||
}
|
||||
|
||||
// gormigrate create *gormigrate.Gormigrate
|
||||
func (mc *MigrationCmd) gormigrate() *gormigrate.Gormigrate {
|
||||
return gormigrate.New(database.Instance(), gormigrate.DefaultOptions, mc.MigrationCollection)
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
package migration
|
||||
|
||||
import (
|
||||
"github.com/go-gormigrate/gormigrate/v2"
|
||||
"pet-house.com/core/g"
|
||||
"pet-house.com/core/server/database"
|
||||
"pet-house.com/core/server/zap_server"
|
||||
"testing"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Test struct {
|
||||
gorm.Model
|
||||
}
|
||||
|
||||
var id = "20211214120700_create_tests_table"
|
||||
var m = &gormigrate.Migration{
|
||||
ID: id,
|
||||
Migrate: func(tx *gorm.DB) error {
|
||||
return tx.AutoMigrate(&Test{})
|
||||
},
|
||||
Rollback: func(tx *gorm.DB) error {
|
||||
return tx.Migrator().DropTable("tests")
|
||||
},
|
||||
}
|
||||
|
||||
func TestAddMigration(t *testing.T) {
|
||||
migrate := New()
|
||||
t.Run("migrate add migration", func(t *testing.T) {
|
||||
migrate.AddMigration(m)
|
||||
l := migrate.MigrationLen()
|
||||
if l != 1 {
|
||||
t.Errorf("MigrationLen want %d but get %d", 1, l)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
type testSeed struct{}
|
||||
|
||||
func (ts *testSeed) Init() error {
|
||||
return nil
|
||||
}
|
||||
func TestAddSeed(t *testing.T) {
|
||||
migrate := New()
|
||||
t.Run("migrate add seed", func(t *testing.T) {
|
||||
migrate.AddSeed(&testSeed{})
|
||||
l := migrate.SeedlLen()
|
||||
if l != 1 {
|
||||
t.Errorf("SeedlLen want %d but get %d", 1, l)
|
||||
}
|
||||
})
|
||||
}
|
||||
func TestMigrate(t *testing.T) {
|
||||
defer zap_server.Remove()
|
||||
defer database.Remove()
|
||||
database.CONFIG.Path = g.TestMysqlAddr
|
||||
database.CONFIG.Password = g.TestMysqlPwd
|
||||
migrate := New()
|
||||
migrate.AddMigration(m)
|
||||
t.Run("migrate migrate", func(t *testing.T) {
|
||||
err := migrate.Migrate()
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
})
|
||||
}
|
||||
func TestRollback(t *testing.T) {
|
||||
defer zap_server.Remove()
|
||||
defer database.Remove()
|
||||
database.CONFIG.Path = g.TestMysqlAddr
|
||||
database.CONFIG.Password = g.TestMysqlPwd
|
||||
migrate := New()
|
||||
t.Run("migrate rollback no migrate with id", func(t *testing.T) {
|
||||
err := migrate.Rollback(id)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
})
|
||||
t.Run("migrate rollback no migrate without id", func(t *testing.T) {
|
||||
err := migrate.Rollback("")
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
})
|
||||
migrate.AddMigration(m)
|
||||
err := migrate.Migrate()
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
t.Run("migrate rollback after migrate with id", func(t *testing.T) {
|
||||
err := migrate.Rollback(id)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
})
|
||||
t.Run("migrate rollback after migrate without id", func(t *testing.T) {
|
||||
err := migrate.Rollback("")
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestRefresh(t *testing.T) {
|
||||
defer zap_server.Remove()
|
||||
defer database.Remove()
|
||||
database.CONFIG.Path = g.TestMysqlAddr
|
||||
database.CONFIG.Password = g.TestMysqlPwd
|
||||
migrate := New()
|
||||
|
||||
t.Run("migrate refresh no migrate", func(t *testing.T) {
|
||||
err := migrate.Refresh()
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
})
|
||||
|
||||
migrate.AddMigration(m)
|
||||
err := migrate.Migrate()
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
t.Run("migrate refresh after migrate", func(t *testing.T) {
|
||||
err := migrate.Refresh()
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user