فهرست منبع

feat(command): migrate rollback 命令

runningwater 7 ماه پیش
والد
کامیت
b168b34fc7
3فایلهای تغییر یافته به همراه56 افزوده شده و 1 حذف شده
  1. 1 0
      README.md
  2. 15 1
      app/cmd/migrate.go
  3. 40 0
      pkg/migrate/migrator.go

+ 1 - 0
README.md

@@ -72,6 +72,7 @@ UNIQUE KEY `migration` (`migration`)
 
 #### 🚀 新功能
 
+- *(command)* Migrate rollback 命令
 - *(command)* Make migration 命令
 - *(command)* Migrate up 命令
 - *(middlewares)* Cors 中间件

+ 15 - 1
app/cmd/migrate.go

@@ -15,20 +15,34 @@ var CmdMigrate = &cobra.Command{
 	Use:   "migrate",
 	Short: "Run database migrations",
 }
+
 var CmdMigrateUp = &cobra.Command{
 	Use:   "up",
 	Short: "Run up migrations",
 	Run:   runUp,
 }
 
+var CmdMigrateRollback = &cobra.Command{
+	Use:     "down",
+	Aliases: []string{"rollback"},
+	Short:   "Run rollback migrations",
+	Run:     runDown,
+}
+
 // 初始化命令
 func init() {
-	CmdMigrate.AddCommand(CmdMigrateUp)
+	CmdMigrate.AddCommand(
+		CmdMigrateUp,
+		CmdMigrateRollback,
+	)
 }
 
 func runUp(cmd *cobra.Command, args []string) {
 	migrator().Up()
 }
+func runDown(cmd *cobra.Command, args []string) {
+	migrator().Rollback()
+}
 
 func migrator() *migrate.Migrator {
 	// 注册 database/migrations 目录下的所有迁移文件

+ 40 - 0
pkg/migrate/migrator.go

@@ -78,6 +78,46 @@ func (m *Migrator) Up() {
 	}
 }
 
+// Rollback 回滚上一次的迁移操作
+func (m *Migrator) Rollback() {
+
+	// 获取最后一批次的迁移数据
+	lastMigration := Migration{}
+	m.DB.Order("id desc").First(&lastMigration)
+	migrations := []Migration{}
+	m.DB.Where("batch = ?", lastMigration.Batch).Order("id desc").Find(&migrations)
+
+	// 回滚迁移操作
+	if !m.rollbackMigrations(migrations) {
+		console.Success("[migrations] table is empty, nothing to rollback")
+	}
+}
+
+// 回滚迁移操作
+func (m *Migrator) rollbackMigrations(migrations []Migration) bool {
+
+	// 标记是否真的有执行了迁移回退的操作
+	runed := false
+	// 遍历迁移数据,回滚迁移操作
+	for _, migration := range migrations {
+		// 友好提示
+		console.Warning("rolling back " + migration.Migration + " ...")
+		// 获取迁移文件
+		mfile := getMigrationFile(migration.Migration)
+		if mfile.Down != nil {
+			// 执行迁移回退操作
+			mfile.Down(database.DB.Migrator(), database.SQLDB)
+		}
+		runed = true
+
+		// 删除迁移数据
+		m.DB.Delete(&migration)
+		console.Success("rolled back " + migration.Migration + " finished")
+	}
+
+	return runed
+}
+
 // 获取当前这个批次的值
 func (m *Migrator) getBatch() int {