Fix struct scanner

This commit is contained in:
caelansar 2020-08-09 18:04:07 +08:00
parent 39c8d6220b
commit a80d4d1083

View File

@ -734,14 +734,19 @@ func (field *Field) setupValuerAndSetter() {
if _, ok := fieldValue.Interface().(sql.Scanner); ok { if _, ok := fieldValue.Interface().(sql.Scanner); ok {
// struct scanner // struct scanner
field.Set = func(value reflect.Value, v interface{}) (err error) { field.Set = func(value reflect.Value, v interface{}) (err error) {
reflectV := reflect.ValueOf(v)
if valuer, ok := v.(driver.Valuer); ok { if valuer, ok := v.(driver.Valuer); ok {
v, _ = valuer.Value() v, _ = valuer.Value()
} }
reflectV := reflect.ValueOf(v) if reflectV.Kind() == reflect.Ptr && reflectV.Elem().Type().AssignableTo(field.FieldType) {
if !reflectV.IsValid() { field.ReflectValueOf(value).Set(reflectV.Elem())
} else if !reflectV.IsValid() {
reflectV = reflect.ValueOf(v)
field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem()) field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())
} else if reflectV.Kind() == reflect.Ptr { } else if reflectV.Kind() == reflect.Ptr {
reflectV = reflect.ValueOf(v)
if reflectV.Elem().IsNil() || !reflectV.Elem().IsValid() { if reflectV.Elem().IsNil() || !reflectV.Elem().IsValid() {
field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem()) field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())
} else { } else {