From 48791ed171c6b8a4a0b9fc6276fbe02a6dd1a130 Mon Sep 17 00:00:00 2001 From: wk30 Date: Fri, 14 May 2021 18:48:25 +0800 Subject: [PATCH] Set default autoUpdateTime and autoCreatedTime -1 --- callbacks/create.go | 4 ++-- callbacks/update.go | 20 +++++++++++--------- schema/field.go | 10 ++++++++-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/callbacks/create.go b/callbacks/create.go index 727bd380..52e18b01 100644 --- a/callbacks/create.go +++ b/callbacks/create.go @@ -274,7 +274,7 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) { if field.DefaultValueInterface != nil { values.Values[i][idx] = field.DefaultValueInterface field.Set(rv, field.DefaultValueInterface) - } else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 { + } else if field.AutoCreateTime >= 0 || field.AutoUpdateTime >= 0 { field.Set(rv, curTime) values.Values[i][idx], _ = field.ValueOf(rv) } @@ -316,7 +316,7 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) { if field.DefaultValueInterface != nil { values.Values[0][idx] = field.DefaultValueInterface field.Set(stmt.ReflectValue, field.DefaultValueInterface) - } else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 { + } else if field.AutoCreateTime >= 0 || field.AutoUpdateTime >= 0 { field.Set(stmt.ReflectValue, curTime) values.Values[0][idx], _ = field.ValueOf(stmt.ReflectValue) } diff --git a/callbacks/update.go b/callbacks/update.go index 75bb02db..6d3cff40 100644 --- a/callbacks/update.go +++ b/callbacks/update.go @@ -201,7 +201,8 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { if !stmt.SkipHooks && stmt.Schema != nil { for _, dbName := range stmt.Schema.DBNames { field := stmt.Schema.LookUpField(dbName) - if field.AutoUpdateTime > 0 && value[field.Name] == nil && value[field.DBName] == nil { + + if field.AutoUpdateTime >= 0 && value[field.Name] == nil && value[field.DBName] == nil { if v, ok := selectColumns[field.DBName]; (ok && v) || !ok { now := stmt.DB.NowFunc() assignValue(field, now) @@ -210,10 +211,10 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now.UnixNano()}) } else if field.AutoUpdateTime == schema.UnixMillisecond { set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now.UnixNano() / 1e6}) - } else if field.GORMDataType == schema.Time { - set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now}) - } else { + } else if field.AutoUpdateTime == schema.UnixSecond { set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now.Unix()}) + } else { + set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now}) } } } @@ -225,18 +226,19 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { set = make([]clause.Assignment, 0, len(stmt.Schema.FieldsByDBName)) for _, dbName := range stmt.Schema.DBNames { field := stmt.Schema.LookUpField(dbName) + if !field.PrimaryKey || (!updatingValue.CanAddr() || stmt.Dest != stmt.Model) { - if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && (!restricted || (!stmt.SkipHooks && field.AutoUpdateTime > 0))) { + if v, ok := selectColumns[field.DBName]; (ok && v) || (!ok && (!restricted || (!stmt.SkipHooks && field.AutoUpdateTime >= 0))) { value, isZero := field.ValueOf(updatingValue) - if !stmt.SkipHooks && field.AutoUpdateTime > 0 { + if !stmt.SkipHooks && field.AutoUpdateTime >= 0 { if field.AutoUpdateTime == schema.UnixNanosecond { value = stmt.DB.NowFunc().UnixNano() } else if field.AutoUpdateTime == schema.UnixMillisecond { value = stmt.DB.NowFunc().UnixNano() / 1e6 - } else if field.GORMDataType == schema.Time { - value = stmt.DB.NowFunc() - } else { + } else if field.AutoUpdateTime == schema.UnixSecond { value = stmt.DB.NowFunc().Unix() + } else { + value = stmt.DB.NowFunc() } isZero = false } diff --git a/schema/field.go b/schema/field.go index 5dbc96f1..734efe00 100644 --- a/schema/field.go +++ b/schema/field.go @@ -89,6 +89,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { TagSettings: ParseTagSetting(fieldStruct.Tag.Get("gorm"), ";"), Schema: schema, AutoIncrementIncrement: 1, + AutoUpdateTime: -1, + AutoCreateTime: -1, } for field.IndirectFieldType.Kind() == reflect.Ptr { @@ -250,7 +252,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { field.DataType = DataType(dataTyper.GormDataType()) } - if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) { + if v, ok := field.TagSettings["AUTOCREATETIME"]; ok && (field.DataType == Time || field.DataType == Int || field.DataType == Uint) { if strings.ToUpper(v) == "NANO" { field.AutoCreateTime = UnixNanosecond } else if strings.ToUpper(v) == "MILLI" { @@ -258,9 +260,11 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { } else { field.AutoCreateTime = UnixSecond } + } else if ok && field.Name == "CreatedAt" { + field.AutoCreateTime = 0 } - if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok || (field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) { + if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok && (field.DataType == Time || field.DataType == Int || field.DataType == Uint) { if strings.ToUpper(v) == "NANO" { field.AutoUpdateTime = UnixNanosecond } else if strings.ToUpper(v) == "MILLI" { @@ -268,6 +272,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { } else { field.AutoUpdateTime = UnixSecond } + } else if ok && field.Name == "UpdatedAt" { + field.AutoUpdateTime = 0 } if val, ok := field.TagSettings["TYPE"]; ok {