diff --git a/migrator/migrator.go b/migrator/migrator.go index d4989410..95b2d75b 100644 --- a/migrator/migrator.go +++ b/migrator/migrator.go @@ -11,6 +11,7 @@ import ( "gorm.io/gorm" "gorm.io/gorm/clause" "gorm.io/gorm/schema" + "gorm.io/gorm/utils" ) var ( @@ -448,7 +449,8 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy } // check default value - if v, ok := columnType.DefaultValue(); ok && v != field.DefaultValue { + if v, ok := columnType.DefaultValue(); ok && + utils.CheckColumnDefaultNull(v) != utils.CheckColumnDefaultNull(field.DefaultValue) { // not primary key if !field.PrimaryKey { alterColumn = true diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 28ee28cb..ed089fc7 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -657,3 +657,56 @@ func TestMigrateWithSpecialName(t *testing.T) { AssertEqual(t, true, DB.Migrator().HasTable("coupon_product_1")) AssertEqual(t, true, DB.Migrator().HasTable("coupon_product_2")) } + +func TestUniqueColumn(t *testing.T) { + type UniqueTest struct { + ID string `gorm:"primary_key"` + Name string `gorm:"unique"` + } + + var err error + err = DB.Migrator().DropTable(&UniqueTest{}) + if err != nil { + t.Errorf("DropTable err:%v", err) + } + + err = DB.AutoMigrate(&UniqueTest{}) + if err != nil { + t.Fatalf("AutoMigrate err:%v", err) + } + + err = DB.AutoMigrate(&UniqueTest{}) + if err != nil { + t.Fatalf("AutoMigrate err:%v", err) + } + + AssertEqual(t, true, DB.Migrator().HasIndex(&UniqueTest{}, "name")) + AssertEqual(t, false, DB.Migrator().HasIndex(&UniqueTest{}, "name_1")) + AssertEqual(t, false, DB.Migrator().HasIndex(&UniqueTest{}, "name_2")) + AssertEqual(t, false, DB.Migrator().HasIndex(&UniqueTest{}, "name_2")) + + type UniqueTest2 struct { + ID string `gorm:"primary_key"` + Name string `gorm:"unique;default:NULL"` + } + + err = DB.Migrator().DropTable(&UniqueTest2{}) + if err != nil { + t.Errorf("DropTable err:%v", err) + } + + err = DB.AutoMigrate(&UniqueTest2{}) + if err != nil { + t.Fatalf("AutoMigrate err:%v", err) + } + + err = DB.AutoMigrate(&UniqueTest2{}) + if err != nil { + t.Fatalf("AutoMigrate err:%v", err) + } + + AssertEqual(t, true, DB.Migrator().HasIndex(&UniqueTest2{}, "name")) + AssertEqual(t, false, DB.Migrator().HasIndex(&UniqueTest2{}, "name_1")) + AssertEqual(t, false, DB.Migrator().HasIndex(&UniqueTest2{}, "name_2")) + AssertEqual(t, false, DB.Migrator().HasIndex(&UniqueTest2{}, "name_2")) +} diff --git a/utils/utils.go b/utils/utils.go index 296917b9..78af8d64 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -46,6 +46,13 @@ func CheckTruth(vals ...string) bool { return false } +func CheckColumnDefaultNull(val string) bool { + if val == "" || !strings.EqualFold(val, "NULL") { + return true + } + return false +} + func ToStringKey(values ...interface{}) string { results := make([]string, len(values))