From a01ac51ca798978348a8eb4adb349c6a77d6a3a6 Mon Sep 17 00:00:00 2001 From: LIN Date: Wed, 5 Mar 2025 17:32:22 +0800 Subject: [PATCH] Fix AutoMigrate, alterColumn The previous modifications were ignored --- migrator/migrator.go | 4 ++-- tests/migrate_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/migrator/migrator.go b/migrator/migrator.go index cec4e30f..ddb8d69d 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -549,9 +549,9 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy case schema.Bool: v1, _ := strconv.ParseBool(dv) v2, _ := strconv.ParseBool(field.DefaultValue) - alterColumn = v1 != v2 + alterColumn = alterColumn || (v1 != v2) default: - alterColumn = dv != field.DefaultValue + alterColumn = alterColumn || (dv != field.DefaultValue) } } } diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 6c8a4216..9b795671 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -715,6 +715,45 @@ func TestMigrateColumns(t *testing.T) { } } +func TestMigrateColumnUpdateSize(t *testing.T) { + + sqlite := DB.Dialector.Name() == "sqlite" + + type UpdateColumnSizeStruct struct { + gorm.Model + Name string `gorm:"column:name;default:'';size:16"` + } + + _ = DB.Migrator().DropTable(&UpdateColumnSizeStruct{}) + + if err := DB.AutoMigrate(&UpdateColumnSizeStruct{}); err != nil { + t.Errorf("Failed to migrate, got %v", err) + } + + type UpdateColumnSizeStruct2 struct { + gorm.Model + Name string `gorm:"column:name;default:'';size:100"` // size change 16 -> 100 + } + + if err := DB.Table("update_column_size_structs").AutoMigrate(&UpdateColumnSizeStruct2{}); err != nil { + t.Fatalf("no error should happened when auto migrate column, but got %v", err) + } + + if columnTypes, err := DB.Migrator().ColumnTypes(&UpdateColumnSizeStruct{}); err != nil { + t.Fatalf("no error should returns for ColumnTypes") + } else { + + for _, columnType := range columnTypes { + if columnType.Name() == "name" { + if length, ok := columnType.Length(); !sqlite && (!ok || length != 100) { + t.Fatalf("column name length should be correct, name: %v, length: %v, expects: %v, column: %#v", + columnType.Name(), length, 100, columnType) + } + } + } + } +} + func TestMigrateConstraint(t *testing.T) { names := []string{"Account", "fk_users_account", "Pets", "fk_users_pets", "Company", "fk_users_company", "Team", "fk_users_team", "Languages", "fk_users_languages"}