Set default autoUpdateTime and autoCreatedTime -1

This commit is contained in:
wk30 2021-05-14 18:48:25 +08:00
parent a480bd8545
commit 48791ed171
3 changed files with 21 additions and 13 deletions

View File

@ -274,7 +274,7 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
if field.DefaultValueInterface != nil { if field.DefaultValueInterface != nil {
values.Values[i][idx] = field.DefaultValueInterface values.Values[i][idx] = field.DefaultValueInterface
field.Set(rv, 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) field.Set(rv, curTime)
values.Values[i][idx], _ = field.ValueOf(rv) values.Values[i][idx], _ = field.ValueOf(rv)
} }
@ -316,7 +316,7 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
if field.DefaultValueInterface != nil { if field.DefaultValueInterface != nil {
values.Values[0][idx] = field.DefaultValueInterface values.Values[0][idx] = field.DefaultValueInterface
field.Set(stmt.ReflectValue, 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) field.Set(stmt.ReflectValue, curTime)
values.Values[0][idx], _ = field.ValueOf(stmt.ReflectValue) values.Values[0][idx], _ = field.ValueOf(stmt.ReflectValue)
} }

View File

@ -201,7 +201,8 @@ func ConvertToAssignments(stmt *gorm.Statement) (set clause.Set) {
if !stmt.SkipHooks && stmt.Schema != nil { if !stmt.SkipHooks && stmt.Schema != nil {
for _, dbName := range stmt.Schema.DBNames { for _, dbName := range stmt.Schema.DBNames {
field := stmt.Schema.LookUpField(dbName) 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 { if v, ok := selectColumns[field.DBName]; (ok && v) || !ok {
now := stmt.DB.NowFunc() now := stmt.DB.NowFunc()
assignValue(field, now) 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()}) set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now.UnixNano()})
} else if field.AutoUpdateTime == schema.UnixMillisecond { } else if field.AutoUpdateTime == schema.UnixMillisecond {
set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now.UnixNano() / 1e6}) set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now.UnixNano() / 1e6})
} else if field.GORMDataType == schema.Time { } else if field.AutoUpdateTime == schema.UnixSecond {
set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now})
} else {
set = append(set, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: now.Unix()}) 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)) set = make([]clause.Assignment, 0, len(stmt.Schema.FieldsByDBName))
for _, dbName := range stmt.Schema.DBNames { for _, dbName := range stmt.Schema.DBNames {
field := stmt.Schema.LookUpField(dbName) field := stmt.Schema.LookUpField(dbName)
if !field.PrimaryKey || (!updatingValue.CanAddr() || stmt.Dest != stmt.Model) { 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) value, isZero := field.ValueOf(updatingValue)
if !stmt.SkipHooks && field.AutoUpdateTime > 0 { if !stmt.SkipHooks && field.AutoUpdateTime >= 0 {
if field.AutoUpdateTime == schema.UnixNanosecond { if field.AutoUpdateTime == schema.UnixNanosecond {
value = stmt.DB.NowFunc().UnixNano() value = stmt.DB.NowFunc().UnixNano()
} else if field.AutoUpdateTime == schema.UnixMillisecond { } else if field.AutoUpdateTime == schema.UnixMillisecond {
value = stmt.DB.NowFunc().UnixNano() / 1e6 value = stmt.DB.NowFunc().UnixNano() / 1e6
} else if field.GORMDataType == schema.Time { } else if field.AutoUpdateTime == schema.UnixSecond {
value = stmt.DB.NowFunc()
} else {
value = stmt.DB.NowFunc().Unix() value = stmt.DB.NowFunc().Unix()
} else {
value = stmt.DB.NowFunc()
} }
isZero = false isZero = false
} }

View File

@ -89,6 +89,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
TagSettings: ParseTagSetting(fieldStruct.Tag.Get("gorm"), ";"), TagSettings: ParseTagSetting(fieldStruct.Tag.Get("gorm"), ";"),
Schema: schema, Schema: schema,
AutoIncrementIncrement: 1, AutoIncrementIncrement: 1,
AutoUpdateTime: -1,
AutoCreateTime: -1,
} }
for field.IndirectFieldType.Kind() == reflect.Ptr { for field.IndirectFieldType.Kind() == reflect.Ptr {
@ -250,7 +252,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
field.DataType = DataType(dataTyper.GormDataType()) 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" { if strings.ToUpper(v) == "NANO" {
field.AutoCreateTime = UnixNanosecond field.AutoCreateTime = UnixNanosecond
} else if strings.ToUpper(v) == "MILLI" { } else if strings.ToUpper(v) == "MILLI" {
@ -258,9 +260,11 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
} else { } else {
field.AutoCreateTime = UnixSecond 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" { if strings.ToUpper(v) == "NANO" {
field.AutoUpdateTime = UnixNanosecond field.AutoUpdateTime = UnixNanosecond
} else if strings.ToUpper(v) == "MILLI" { } else if strings.ToUpper(v) == "MILLI" {
@ -268,6 +272,8 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
} else { } else {
field.AutoUpdateTime = UnixSecond field.AutoUpdateTime = UnixSecond
} }
} else if ok && field.Name == "UpdatedAt" {
field.AutoUpdateTime = 0
} }
if val, ok := field.TagSettings["TYPE"]; ok { if val, ok := field.TagSettings["TYPE"]; ok {