From bd1e254bf309ae0e8bf80fa97a76af4e424f0315 Mon Sep 17 00:00:00 2001 From: qinains Date: Thu, 30 Jul 2020 15:03:09 +0800 Subject: [PATCH] Auto creating/updating time with unix (milli) second --- callbacks/update.go | 10 +++++++--- schema/field.go | 13 +++++++++++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/callbacks/update.go b/callbacks/update.go index e492cfc9..12806af6 100644 --- a/callbacks/update.go +++ b/callbacks/update.go @@ -140,7 +140,7 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { if !updatingValue.CanAddr() || stmt.Dest != stmt.Model { switch stmt.ReflectValue.Kind() { case reflect.Slice, reflect.Array: - var priamryKeyExprs []clause.Expression + var primaryKeyExprs []clause.Expression for i := 0; i < stmt.ReflectValue.Len(); i++ { var exprs = make([]clause.Expression, len(stmt.Schema.PrimaryFields)) var notZero bool @@ -150,10 +150,10 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { notZero = notZero || !isZero } if notZero { - priamryKeyExprs = append(priamryKeyExprs, clause.And(exprs...)) + primaryKeyExprs = append(primaryKeyExprs, clause.And(exprs...)) } } - stmt.AddClause(clause.Where{Exprs: []clause.Expression{clause.Or(priamryKeyExprs...)}}) + stmt.AddClause(clause.Where{Exprs: []clause.Expression{clause.Or(primaryKeyExprs...)}}) case reflect.Struct: for _, field := range stmt.Schema.PrimaryFields { if value, isZero := field.ValueOf(stmt.ReflectValue); !isZero { @@ -202,6 +202,8 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { if field.AutoUpdateTime == schema.UnixNanosecond { 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 { @@ -223,6 +225,8 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) { if 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 { diff --git a/schema/field.go b/schema/field.go index 329ae41c..a2f3649c 100644 --- a/schema/field.go +++ b/schema/field.go @@ -19,8 +19,9 @@ type DataType string type TimeType int64 const ( - UnixSecond TimeType = 1 - UnixNanosecond TimeType = 2 + UnixSecond TimeType = 1 + UnixMillisecond TimeType = 2 + UnixNanosecond TimeType = 3 ) const ( @@ -231,6 +232,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) { if strings.ToUpper(v) == "NANO" { field.AutoCreateTime = UnixNanosecond + } else if strings.ToUpper(v) == "MILLI" { + field.AutoCreateTime = UnixMillisecond } else { field.AutoCreateTime = UnixSecond } @@ -239,6 +242,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok || (field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) { if strings.ToUpper(v) == "NANO" { field.AutoUpdateTime = UnixNanosecond + } else if strings.ToUpper(v) == "MILLI" { + field.AutoUpdateTime = UnixMillisecond } else { field.AutoUpdateTime = UnixSecond } @@ -549,6 +554,8 @@ func (field *Field) setupValuerAndSetter() { case time.Time: if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond { field.ReflectValueOf(value).SetInt(data.UnixNano()) + } else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond { + field.ReflectValueOf(value).SetInt(data.UnixNano() / 1e6) } else { field.ReflectValueOf(value).SetInt(data.Unix()) } @@ -556,6 +563,8 @@ func (field *Field) setupValuerAndSetter() { if data != nil { if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond { field.ReflectValueOf(value).SetInt(data.UnixNano()) + } else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond { + field.ReflectValueOf(value).SetInt(data.UnixNano() / 1e6) } else { field.ReflectValueOf(value).SetInt(data.Unix()) }