Skip to content

Commit e8650c9

Browse files
committed
Update
1 parent 15283a0 commit e8650c9

2 files changed

Lines changed: 52 additions & 15 deletions

File tree

pkg/dbmate/db.go

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -741,8 +741,8 @@ func (db *DB) Rollback() error {
741741
return nil
742742
}
743743

744-
// MigrateOnly applies exactly one pending migration that matches the given version.
745-
func (db *DB) MigrateOnly(version string) error {
744+
// migrateOnly applies exactly one pending migration that matches the given version.
745+
func (db *DB) migrateOnly(version string) error {
746746
drv, err := db.Driver()
747747
if err != nil {
748748
return err
@@ -813,8 +813,8 @@ func (db *DB) MigrateOnly(version string) error {
813813
return nil
814814
}
815815

816-
// RollbackOnly rolls back exactly one applied migration that matches the given version.
817-
func (db *DB) RollbackOnly(version string) error {
816+
// rollbackOnly rolls back exactly one applied migration that matches the given version.
817+
func (db *DB) rollbackOnly(version string) error {
818818
drv, err := db.Driver()
819819
if err != nil {
820820
return err
@@ -878,6 +878,43 @@ func (db *DB) RollbackOnly(version string) error {
878878
return nil
879879
}
880880

881+
// MigrateTo applies every pending migration whose version ≤ target (inclusive).
882+
func (db *DB) MigrateTo(target string) error {
883+
migs, err := db.FindMigrations()
884+
if err != nil {
885+
return err
886+
}
887+
888+
for _, m := range migs {
889+
if m.Applied || m.Version > target {
890+
continue
891+
}
892+
if err := db.migrateOnly(m.Version); err != nil {
893+
return err
894+
}
895+
}
896+
return nil
897+
}
898+
899+
// RollbackTo rolls back until version == target remains applied (exclusive).
900+
func (db *DB) RollbackTo(target string) error {
901+
migs, err := db.FindMigrations()
902+
if err != nil {
903+
return err
904+
}
905+
// process latest-first
906+
for i := len(migs) - 1; i >= 0; i-- {
907+
m := migs[i]
908+
if !m.Applied || m.Version == target {
909+
continue
910+
}
911+
if err := db.rollbackOnly(m.Version); err != nil {
912+
return err
913+
}
914+
}
915+
return nil
916+
}
917+
881918
// Status shows the status of all migrations
882919
func (db *DB) Status(quiet bool) (int, error) {
883920
results, err := db.FindMigrations()

pkg/dbmate/db_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ func TestRollbackAll(t *testing.T) {
593593
})
594594
}
595595

596-
func TestMigrateOnly(t *testing.T) {
596+
func TestMigrateTo(t *testing.T) {
597597
testEachURL(t, func(t *testing.T, u *url.URL) {
598598
const v1 = "20151129054053" // users
599599
const v2 = "20200227231541" // posts
@@ -605,7 +605,7 @@ func TestMigrateOnly(t *testing.T) {
605605
require.NoError(t, db.Drop())
606606
require.NoError(t, db.Create())
607607

608-
require.NoError(t, db.MigrateOnly(v1))
608+
require.NoError(t, db.MigrateTo(v1))
609609

610610
sqlDB, err := drv.Open()
611611
require.NoError(t, err)
@@ -619,20 +619,20 @@ func TestMigrateOnly(t *testing.T) {
619619
require.NoError(t, sqlDB.QueryRow("select count(*) from users").Scan(&cnt))
620620
require.Error(t, sqlDB.QueryRow("select count(*) from posts").Scan(&cnt))
621621

622-
require.NoError(t, db.MigrateOnly(v1))
622+
require.NoError(t, db.MigrateTo(v1))
623623

624-
err = db.MigrateOnly("99999999999999")
624+
err = db.MigrateTo("99999999999999")
625625
require.ErrorIs(t, err, dbmate.ErrMigrationNotFound)
626626

627627
db.Strict = true
628-
err = db.MigrateOnly(v2)
628+
err = db.MigrateTo(v2)
629629
require.NoError(t, err)
630630

631-
require.NoError(t, db.MigrateOnly(v1))
631+
require.NoError(t, db.MigrateTo(v1))
632632
})
633633
}
634634

635-
func TestRollbackOnly(t *testing.T) {
635+
func TestRollbackTo(t *testing.T) {
636636
testEachURL(t, func(t *testing.T, u *url.URL) {
637637
const v1 = "20151129054053" // users
638638
const v2 = "20200227231541" // posts
@@ -652,7 +652,7 @@ func TestRollbackOnly(t *testing.T) {
652652
applied, _ := drv.SelectMigrations(sqlDB, -1)
653653
require.Equal(t, map[string]bool{v1: true, v2: true}, applied)
654654

655-
require.NoError(t, db.RollbackOnly(v2))
655+
require.NoError(t, db.RollbackTo(v2))
656656

657657
applied, _ = drv.SelectMigrations(sqlDB, -1)
658658
require.Equal(t, map[string]bool{v1: true}, applied)
@@ -661,14 +661,14 @@ func TestRollbackOnly(t *testing.T) {
661661
require.NoError(t, sqlDB.QueryRow("select count(*) from users").Scan(&cnt))
662662
require.Error(t, sqlDB.QueryRow("select count(*) from posts").Scan(&cnt))
663663

664-
err = db.RollbackOnly(v2)
664+
err = db.RollbackTo(v2)
665665
require.Error(t, err)
666666
require.Contains(t, err.Error(), "not applied")
667667

668-
err = db.RollbackOnly("99999999999999")
668+
err = db.RollbackTo("99999999999999")
669669
require.ErrorIs(t, err, dbmate.ErrMigrationNotFound)
670670

671-
require.NoError(t, db.RollbackOnly(v1))
671+
require.NoError(t, db.RollbackTo(v1))
672672
applied, _ = drv.SelectMigrations(sqlDB, -1)
673673
require.Empty(t, applied)
674674
})

0 commit comments

Comments
 (0)