refactor: make migration process more intelligent, add test coverage
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user