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