|
|
@@ -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 {
|
|
|
|