refactor: make migration process more intelligent, add test coverage

This commit is contained in:
2026-09-19 21:36:31 -07:00
parent ff7f0a57c8
commit 40bc0db036
6 changed files with 361 additions and 32 deletions

View File

@@ -89,40 +89,27 @@ func (c DBConfig) CheckAndUpdateVersion(db *sqlx.DB) error {
fmt.Printf("Database version is out of date. Upgrading database from version %d to version %d!\n", version,
c.version_number)
fmt.Print(textutils.ColorReset)
c.UpgradeFromXToY(db, version, c.version_number)
for i := version; i < c.version_number; i++ {
m := (*c.migrations)[i]
if err := m.Apply(db); err != nil {
return fmt.Errorf("migration %d: %w", m.ID, err)
}
fmt.Print(textutils.ColorYellow)
fmt.Printf("Now at database schema version %d.\n", m.ID)
fmt.Print(textutils.ColorReset)
}
fmt.Print(textutils.ColorGreen)
fmt.Printf("================================================\n")
fmt.Printf("Database version has been upgraded to version %d.\n", c.version_number)
fmt.Print(textutils.ColorReset)
}
return nil
}
// UpgradeFromXToY runs all the migrations from version X to version Y, and update the `database_version` table's `version_number`
func (c DBConfig) UpgradeFromXToY(db *sqlx.DB, x uint, y uint) {
for i := x; i < y; i++ {
fmt.Print(textutils.ColorCyan)
fmt.Println((*c.migrations)[i].SQL)
fmt.Print(textutils.ColorReset)
// Execute the migration in a transaction
tx, err := db.Beginx()
if err != nil {
panic(err)
}
tx.MustExec((*c.migrations)[i].SQL)
tx.MustExec("update db_version set version = ?", i+1)
if err := tx.Commit(); err != nil {
panic(err)
}
fmt.Print(textutils.ColorYellow)
fmt.Printf("Now at database schema version %d.\n", i+1)
fmt.Print(textutils.ColorReset)
}
fmt.Print(textutils.ColorGreen)
fmt.Printf("================================================\n")
fmt.Printf("Database version has been upgraded to version %d.\n", y)
fmt.Print(textutils.ColorReset)
}
type VersionMismatchError struct {
EngineVersion uint
DatabaseVersion uint