From c42089d0b07824f0aaf04236d3b8388e9cc23c68 Mon Sep 17 00:00:00 2001 From: a631807682 <631807682@qq.com> Date: Sun, 8 May 2022 17:35:46 +0800 Subject: [PATCH] fix: tag defalut NULL and default not set should be same --- migrator/migrator.go | 4 +++- tests/migrate_test.go | 53 +++++++++++++++++++++++++++++++++++++++++++ utils/utils.go | 7 ++++++ 3 files changed, 63 insertions(+), 1 deletion(-) 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))