package migrate
import (
"fmt"
"gorm.io/gorm"
)
func init() {
RegisterAfterAutoMigration(Migration{
Version: 2,
Up: dropLegacyChannelColumns,
})
}
func dropLegacyChannelColumns(db *gorm.DB) error {
if db == nil {
return fmt.Errorf("db is nil")
}
dialect := db.Dialector.Name()
hasColumn := func(table, column string) bool {
switch dialect {
case "sqlite":
var name string
db.Raw("SELECT name FROM pragma_table_info(?) WHERE name = ? LIMIT 1", table, column).Scan(&name)
return name == column
case "mysql":
var count int64
db.Raw("SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ? AND column_name = ?", table, column).Scan(&count)
return count > 0
case "postgres":
var count int64
db.Raw("SELECT COUNT(*) FROM information_schema.columns WHERE table_name = ? AND column_name = ?", table, column).Scan(&count)
return count > 0
default:
return db.Migrator().HasColumn(table, column)
}
}
dropColumn := func(table, column string) error {
var sql string
switch dialect {
case "sqlite":
sql = fmt.Sprintf("ALTER TABLE %s DROP COLUMN %s", table, column)
case "mysql":
sql = fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN `%s`", table, column)
case "postgres":
sql = fmt.Sprintf("ALTER TABLE %s DROP COLUMN IF EXISTS %s", table, column)
default:
sql = fmt.Sprintf("ALTER TABLE %s DROP COLUMN %s", table, column)
}
return db.Exec(sql).Error
}
if hasColumn("channels", "key") {
if err := dropColumn("channels", "key"); err != nil {
return fmt.Errorf("failed to drop channels.key: %w", err)
}
}
if hasColumn("channels", "base_url") {
if err := dropColumn("channels", "base_url"); err != nil {
return fmt.Errorf("failed to drop channels.base_url: %w", err)
}
}
return nil
}