Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit bbd2bbe

Browse files
0fv0fx
andauthoredDec 24, 2022
fix:Issue migrating field with CURRENT_TIMESTAMP (#5906)
Co-authored-by: ningfei <accelerator314@outlook.com>
1 parent f3c6fc2 commit bbd2bbe

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed
 

‎migrator/migrator.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -470,17 +470,19 @@ func (m Migrator) MigrateColumn(value interface{}, field *schema.Field, columnTy
470470

471471
// check default value
472472
if !field.PrimaryKey {
473+
currentDefaultNotNull := field.HasDefaultValue && !strings.EqualFold(field.DefaultValue, "NULL")
473474
dv, dvNotNull := columnType.DefaultValue()
474-
if dvNotNull && field.DefaultValueInterface == nil {
475+
if dvNotNull && !currentDefaultNotNull {
475476
// defalut value -> null
476477
alterColumn = true
477-
} else if !dvNotNull && field.DefaultValueInterface != nil {
478+
} else if !dvNotNull && currentDefaultNotNull {
478479
// null -> default value
479480
alterColumn = true
480-
} else if dv != field.DefaultValue {
481+
} else if (field.GORMDataType != schema.Time && dv != field.DefaultValue) ||
482+
(field.GORMDataType == schema.Time && !strings.EqualFold(strings.TrimSuffix(dv, "()"), strings.TrimSuffix(field.DefaultValue, "()"))) {
481483
// default value not equal
482484
// not both null
483-
if !(field.DefaultValueInterface == nil && !dvNotNull) {
485+
if currentDefaultNotNull || dvNotNull {
484486
alterColumn = true
485487
}
486488
}

‎tests/migrate_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,32 @@ func TestPrimarykeyID(t *testing.T) {
757757
}
758758
}
759759

760+
func TestCurrentTimestamp(t *testing.T) {
761+
if DB.Dialector.Name() != "mysql" {
762+
return
763+
}
764+
type CurrentTimestampTest struct {
765+
ID string `gorm:"primary_key"`
766+
TimeAt *time.Time `gorm:"type:datetime;not null;default:CURRENT_TIMESTAMP;unique"`
767+
}
768+
var err error
769+
err = DB.Migrator().DropTable(&CurrentTimestampTest{})
770+
if err != nil {
771+
t.Errorf("DropTable err:%v", err)
772+
}
773+
err = DB.AutoMigrate(&CurrentTimestampTest{})
774+
if err != nil {
775+
t.Fatalf("AutoMigrate err:%v", err)
776+
}
777+
778+
err = DB.AutoMigrate(&CurrentTimestampTest{})
779+
if err != nil {
780+
t.Fatalf("AutoMigrate err:%v", err)
781+
}
782+
AssertEqual(t, true, DB.Migrator().HasIndex(&CurrentTimestampTest{}, "time_at"))
783+
AssertEqual(t, false, DB.Migrator().HasIndex(&CurrentTimestampTest{}, "time_at_2"))
784+
}
785+
760786
func TestUniqueColumn(t *testing.T) {
761787
if DB.Dialector.Name() != "mysql" {
762788
return

0 commit comments

Comments
 (0)
Please sign in to comment.