feat: make errors more detailed when setting value to fields
This commit is contained in:
parent
2f4925e017
commit
d770e5b1c5
@ -183,7 +183,7 @@ func Create(config *Config) func(db *gorm.DB) {
|
|||||||
|
|
||||||
_, isZero := pkField.ValueOf(db.Statement.Context, rv)
|
_, isZero := pkField.ValueOf(db.Statement.Context, rv)
|
||||||
if isZero {
|
if isZero {
|
||||||
db.AddError(pkField.Set(db.Statement.Context, rv, insertID))
|
db.AddError(newSetFieldValueError(pkField, pkField.Set(db.Statement.Context, rv, insertID)))
|
||||||
insertID -= pkField.AutoIncrementIncrement
|
insertID -= pkField.AutoIncrementIncrement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -195,7 +195,7 @@ func Create(config *Config) func(db *gorm.DB) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if _, isZero := pkField.ValueOf(db.Statement.Context, rv); isZero {
|
if _, isZero := pkField.ValueOf(db.Statement.Context, rv); isZero {
|
||||||
db.AddError(pkField.Set(db.Statement.Context, rv, insertID))
|
db.AddError(newSetFieldValueError(pkField, pkField.Set(db.Statement.Context, rv, insertID)))
|
||||||
insertID += pkField.AutoIncrementIncrement
|
insertID += pkField.AutoIncrementIncrement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -203,7 +203,7 @@ func Create(config *Config) func(db *gorm.DB) {
|
|||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
_, isZero := pkField.ValueOf(db.Statement.Context, db.Statement.ReflectValue)
|
_, isZero := pkField.ValueOf(db.Statement.Context, db.Statement.ReflectValue)
|
||||||
if isZero {
|
if isZero {
|
||||||
db.AddError(pkField.Set(db.Statement.Context, db.Statement.ReflectValue, insertID))
|
db.AddError(newSetFieldValueError(pkField, pkField.Set(db.Statement.Context, db.Statement.ReflectValue, insertID)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -289,13 +289,13 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
|
|||||||
if values.Values[i][idx], isZero = field.ValueOf(stmt.Context, rv); isZero {
|
if values.Values[i][idx], isZero = field.ValueOf(stmt.Context, rv); isZero {
|
||||||
if field.DefaultValueInterface != nil {
|
if field.DefaultValueInterface != nil {
|
||||||
values.Values[i][idx] = field.DefaultValueInterface
|
values.Values[i][idx] = field.DefaultValueInterface
|
||||||
stmt.AddError(field.Set(stmt.Context, rv, field.DefaultValueInterface))
|
stmt.AddError(newSetFieldValueError(field, field.Set(stmt.Context, rv, field.DefaultValueInterface)))
|
||||||
} else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 {
|
} else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 {
|
||||||
stmt.AddError(field.Set(stmt.Context, rv, curTime))
|
stmt.AddError(newSetFieldValueError(field, field.Set(stmt.Context, rv, curTime)))
|
||||||
values.Values[i][idx], _ = field.ValueOf(stmt.Context, rv)
|
values.Values[i][idx], _ = field.ValueOf(stmt.Context, rv)
|
||||||
}
|
}
|
||||||
} else if field.AutoUpdateTime > 0 && updateTrackTime {
|
} else if field.AutoUpdateTime > 0 && updateTrackTime {
|
||||||
stmt.AddError(field.Set(stmt.Context, rv, curTime))
|
stmt.AddError(newSetFieldValueError(field, field.Set(stmt.Context, rv, curTime)))
|
||||||
values.Values[i][idx], _ = field.ValueOf(stmt.Context, rv)
|
values.Values[i][idx], _ = field.ValueOf(stmt.Context, rv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -331,13 +331,13 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
|
|||||||
if values.Values[0][idx], isZero = field.ValueOf(stmt.Context, stmt.ReflectValue); isZero {
|
if values.Values[0][idx], isZero = field.ValueOf(stmt.Context, stmt.ReflectValue); isZero {
|
||||||
if field.DefaultValueInterface != nil {
|
if field.DefaultValueInterface != nil {
|
||||||
values.Values[0][idx] = field.DefaultValueInterface
|
values.Values[0][idx] = field.DefaultValueInterface
|
||||||
stmt.AddError(field.Set(stmt.Context, stmt.ReflectValue, field.DefaultValueInterface))
|
stmt.AddError(newSetFieldValueError(field, field.Set(stmt.Context, stmt.ReflectValue, field.DefaultValueInterface)))
|
||||||
} else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 {
|
} else if field.AutoCreateTime > 0 || field.AutoUpdateTime > 0 {
|
||||||
stmt.AddError(field.Set(stmt.Context, stmt.ReflectValue, curTime))
|
stmt.AddError(newSetFieldValueError(field, field.Set(stmt.Context, stmt.ReflectValue, curTime)))
|
||||||
values.Values[0][idx], _ = field.ValueOf(stmt.Context, stmt.ReflectValue)
|
values.Values[0][idx], _ = field.ValueOf(stmt.Context, stmt.ReflectValue)
|
||||||
}
|
}
|
||||||
} else if field.AutoUpdateTime > 0 && updateTrackTime {
|
} else if field.AutoUpdateTime > 0 && updateTrackTime {
|
||||||
stmt.AddError(field.Set(stmt.Context, stmt.ReflectValue, curTime))
|
stmt.AddError(newSetFieldValueError(field, field.Set(stmt.Context, stmt.ReflectValue, curTime)))
|
||||||
values.Values[0][idx], _ = field.ValueOf(stmt.Context, stmt.ReflectValue)
|
values.Values[0][idx], _ = field.ValueOf(stmt.Context, stmt.ReflectValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -351,7 +351,7 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
stmt.AddError(gorm.ErrInvalidData)
|
stmt.AddError(fmt.Errorf("%w: expected slice, array or struct, but got %v", gorm.ErrInvalidData, stmt.ReflectValue.Kind()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
36
callbacks/errors.go
Normal file
36
callbacks/errors.go
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package callbacks
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"gorm.io/gorm/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
type _SetFieldValueError struct {
|
||||||
|
Field *schema.Field
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e _SetFieldValueError) Error() string {
|
||||||
|
return fmt.Sprintf("error when set value for field %s: %v", e.Field.Name, e.Err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e _SetFieldValueError) Unwrap() error {
|
||||||
|
return e.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSetFieldValueError(field *schema.Field, e error) error {
|
||||||
|
if e == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
//goland:noinspection GoTypeAssertionOnErrors
|
||||||
|
if we, ok := e.(*_SetFieldValueError); ok && we.Field == field {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
if field == nil {
|
||||||
|
panic("field is nil")
|
||||||
|
}
|
||||||
|
return &_SetFieldValueError{
|
||||||
|
Field: field,
|
||||||
|
Err: e,
|
||||||
|
}
|
||||||
|
}
|
@ -21,7 +21,7 @@ func SetupUpdateReflectValue(db *gorm.DB) {
|
|||||||
if dest, ok := db.Statement.Dest.(map[string]interface{}); ok {
|
if dest, ok := db.Statement.Dest.(map[string]interface{}); ok {
|
||||||
for _, rel := range db.Statement.Schema.Relationships.BelongsTo {
|
for _, rel := range db.Statement.Schema.Relationships.BelongsTo {
|
||||||
if _, ok := dest[rel.Name]; ok {
|
if _, ok := dest[rel.Name]; ok {
|
||||||
db.AddError(rel.Field.Set(db.Statement.Context, db.Statement.ReflectValue, dest[rel.Name]))
|
db.AddError(newSetFieldValueError(rel.Field, rel.Field.Set(db.Statement.Context, db.Statement.ReflectValue, dest[rel.Name])))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user