github.com/systematiccaos/gorm@v1.22.6/schema/field.go (about)

     1  package schema
     2  
     3  import (
     4  	"database/sql"
     5  	"database/sql/driver"
     6  	"fmt"
     7  	"reflect"
     8  	"strconv"
     9  	"strings"
    10  	"sync"
    11  	"time"
    12  
    13  	"github.com/jinzhu/now"
    14  	"github.com/systematiccaos/gorm/utils"
    15  )
    16  
    17  type DataType string
    18  
    19  type TimeType int64
    20  
    21  var TimeReflectType = reflect.TypeOf(time.Time{})
    22  
    23  const (
    24  	UnixTime        TimeType = 1
    25  	UnixSecond      TimeType = 2
    26  	UnixMillisecond TimeType = 3
    27  	UnixNanosecond  TimeType = 4
    28  )
    29  
    30  const (
    31  	Bool   DataType = "bool"
    32  	Int    DataType = "int"
    33  	Uint   DataType = "uint"
    34  	Float  DataType = "float"
    35  	String DataType = "string"
    36  	Time   DataType = "time"
    37  	Bytes  DataType = "bytes"
    38  )
    39  
    40  type Field struct {
    41  	Name                   string
    42  	DBName                 string
    43  	BindNames              []string
    44  	DataType               DataType
    45  	GORMDataType           DataType
    46  	PrimaryKey             bool
    47  	AutoIncrement          bool
    48  	AutoIncrementIncrement int64
    49  	Creatable              bool
    50  	Updatable              bool
    51  	Readable               bool
    52  	HasDefaultValue        bool
    53  	AutoCreateTime         TimeType
    54  	AutoUpdateTime         TimeType
    55  	DefaultValue           string
    56  	DefaultValueInterface  interface{}
    57  	NotNull                bool
    58  	Unique                 bool
    59  	Comment                string
    60  	Size                   int
    61  	Precision              int
    62  	Scale                  int
    63  	FieldType              reflect.Type
    64  	IndirectFieldType      reflect.Type
    65  	StructField            reflect.StructField
    66  	Tag                    reflect.StructTag
    67  	TagSettings            map[string]string
    68  	Schema                 *Schema
    69  	EmbeddedSchema         *Schema
    70  	OwnerSchema            *Schema
    71  	ReflectValueOf         func(reflect.Value) reflect.Value
    72  	ValueOf                func(reflect.Value) (value interface{}, zero bool)
    73  	Set                    func(reflect.Value, interface{}) error
    74  	IgnoreMigration        bool
    75  }
    76  
    77  func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
    78  	var err error
    79  
    80  	field := &Field{
    81  		Name:                   fieldStruct.Name,
    82  		BindNames:              []string{fieldStruct.Name},
    83  		FieldType:              fieldStruct.Type,
    84  		IndirectFieldType:      fieldStruct.Type,
    85  		StructField:            fieldStruct,
    86  		Creatable:              true,
    87  		Updatable:              true,
    88  		Readable:               true,
    89  		Tag:                    fieldStruct.Tag,
    90  		TagSettings:            ParseTagSetting(fieldStruct.Tag.Get("gorm"), ";"),
    91  		Schema:                 schema,
    92  		AutoIncrementIncrement: 1,
    93  	}
    94  
    95  	for field.IndirectFieldType.Kind() == reflect.Ptr {
    96  		field.IndirectFieldType = field.IndirectFieldType.Elem()
    97  	}
    98  
    99  	fieldValue := reflect.New(field.IndirectFieldType)
   100  	// if field is valuer, used its value or first fields as data type
   101  	valuer, isValuer := fieldValue.Interface().(driver.Valuer)
   102  	if isValuer {
   103  		if _, ok := fieldValue.Interface().(GormDataTypeInterface); !ok {
   104  			if v, err := valuer.Value(); reflect.ValueOf(v).IsValid() && err == nil {
   105  				fieldValue = reflect.ValueOf(v)
   106  			}
   107  
   108  			var getRealFieldValue func(reflect.Value)
   109  			getRealFieldValue = func(v reflect.Value) {
   110  				rv := reflect.Indirect(v)
   111  				if rv.Kind() == reflect.Struct && !rv.Type().ConvertibleTo(TimeReflectType) {
   112  					for i := 0; i < rv.Type().NumField(); i++ {
   113  						newFieldType := rv.Type().Field(i).Type
   114  						for newFieldType.Kind() == reflect.Ptr {
   115  							newFieldType = newFieldType.Elem()
   116  						}
   117  
   118  						fieldValue = reflect.New(newFieldType)
   119  
   120  						if rv.Type() != reflect.Indirect(fieldValue).Type() {
   121  							getRealFieldValue(fieldValue)
   122  						}
   123  
   124  						if fieldValue.IsValid() {
   125  							return
   126  						}
   127  
   128  						for key, value := range ParseTagSetting(field.IndirectFieldType.Field(i).Tag.Get("gorm"), ";") {
   129  							if _, ok := field.TagSettings[key]; !ok {
   130  								field.TagSettings[key] = value
   131  							}
   132  						}
   133  					}
   134  				}
   135  			}
   136  
   137  			getRealFieldValue(fieldValue)
   138  		}
   139  	}
   140  
   141  	if dbName, ok := field.TagSettings["COLUMN"]; ok {
   142  		field.DBName = dbName
   143  	}
   144  
   145  	if val, ok := field.TagSettings["PRIMARYKEY"]; ok && utils.CheckTruth(val) {
   146  		field.PrimaryKey = true
   147  	} else if val, ok := field.TagSettings["PRIMARY_KEY"]; ok && utils.CheckTruth(val) {
   148  		field.PrimaryKey = true
   149  	}
   150  
   151  	if val, ok := field.TagSettings["AUTOINCREMENT"]; ok && utils.CheckTruth(val) {
   152  		field.AutoIncrement = true
   153  		field.HasDefaultValue = true
   154  	}
   155  
   156  	if num, ok := field.TagSettings["AUTOINCREMENTINCREMENT"]; ok {
   157  		field.AutoIncrementIncrement, _ = strconv.ParseInt(num, 10, 64)
   158  	}
   159  
   160  	if v, ok := field.TagSettings["DEFAULT"]; ok {
   161  		field.HasDefaultValue = true
   162  		field.DefaultValue = v
   163  	}
   164  
   165  	if num, ok := field.TagSettings["SIZE"]; ok {
   166  		if field.Size, err = strconv.Atoi(num); err != nil {
   167  			field.Size = -1
   168  		}
   169  	}
   170  
   171  	if p, ok := field.TagSettings["PRECISION"]; ok {
   172  		field.Precision, _ = strconv.Atoi(p)
   173  	}
   174  
   175  	if s, ok := field.TagSettings["SCALE"]; ok {
   176  		field.Scale, _ = strconv.Atoi(s)
   177  	}
   178  
   179  	if val, ok := field.TagSettings["NOT NULL"]; ok && utils.CheckTruth(val) {
   180  		field.NotNull = true
   181  	} else if val, ok := field.TagSettings["NOTNULL"]; ok && utils.CheckTruth(val) {
   182  		field.NotNull = true
   183  	}
   184  
   185  	if val, ok := field.TagSettings["UNIQUE"]; ok && utils.CheckTruth(val) {
   186  		field.Unique = true
   187  	}
   188  
   189  	if val, ok := field.TagSettings["COMMENT"]; ok {
   190  		field.Comment = val
   191  	}
   192  
   193  	// default value is function or null or blank (primary keys)
   194  	field.DefaultValue = strings.TrimSpace(field.DefaultValue)
   195  	skipParseDefaultValue := strings.Contains(field.DefaultValue, "(") &&
   196  		strings.Contains(field.DefaultValue, ")") || strings.ToLower(field.DefaultValue) == "null" || field.DefaultValue == ""
   197  	switch reflect.Indirect(fieldValue).Kind() {
   198  	case reflect.Bool:
   199  		field.DataType = Bool
   200  		if field.HasDefaultValue && !skipParseDefaultValue {
   201  			if field.DefaultValueInterface, err = strconv.ParseBool(field.DefaultValue); err != nil {
   202  				schema.err = fmt.Errorf("failed to parse %s as default value for bool, got error: %v", field.DefaultValue, err)
   203  			}
   204  		}
   205  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   206  		field.DataType = Int
   207  		if field.HasDefaultValue && !skipParseDefaultValue {
   208  			if field.DefaultValueInterface, err = strconv.ParseInt(field.DefaultValue, 0, 64); err != nil {
   209  				schema.err = fmt.Errorf("failed to parse %s as default value for int, got error: %v", field.DefaultValue, err)
   210  			}
   211  		}
   212  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
   213  		field.DataType = Uint
   214  		if field.HasDefaultValue && !skipParseDefaultValue {
   215  			if field.DefaultValueInterface, err = strconv.ParseUint(field.DefaultValue, 0, 64); err != nil {
   216  				schema.err = fmt.Errorf("failed to parse %s as default value for uint, got error: %v", field.DefaultValue, err)
   217  			}
   218  		}
   219  	case reflect.Float32, reflect.Float64:
   220  		field.DataType = Float
   221  		if field.HasDefaultValue && !skipParseDefaultValue {
   222  			if field.DefaultValueInterface, err = strconv.ParseFloat(field.DefaultValue, 64); err != nil {
   223  				schema.err = fmt.Errorf("failed to parse %s as default value for float, got error: %v", field.DefaultValue, err)
   224  			}
   225  		}
   226  	case reflect.String:
   227  		field.DataType = String
   228  
   229  		if field.HasDefaultValue && !skipParseDefaultValue {
   230  			field.DefaultValue = strings.Trim(field.DefaultValue, "'")
   231  			field.DefaultValue = strings.Trim(field.DefaultValue, `"`)
   232  			field.DefaultValueInterface = field.DefaultValue
   233  		}
   234  	case reflect.Struct:
   235  		if _, ok := fieldValue.Interface().(*time.Time); ok {
   236  			field.DataType = Time
   237  		} else if fieldValue.Type().ConvertibleTo(TimeReflectType) {
   238  			field.DataType = Time
   239  		} else if fieldValue.Type().ConvertibleTo(reflect.TypeOf(&time.Time{})) {
   240  			field.DataType = Time
   241  		}
   242  	case reflect.Array, reflect.Slice:
   243  		if reflect.Indirect(fieldValue).Type().Elem() == reflect.TypeOf(uint8(0)) {
   244  			field.DataType = Bytes
   245  		}
   246  	}
   247  
   248  	field.GORMDataType = field.DataType
   249  
   250  	if dataTyper, ok := fieldValue.Interface().(GormDataTypeInterface); ok {
   251  		field.DataType = DataType(dataTyper.GormDataType())
   252  	}
   253  
   254  	if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
   255  		if field.DataType == Time {
   256  			field.AutoCreateTime = UnixTime
   257  		} else if strings.ToUpper(v) == "NANO" {
   258  			field.AutoCreateTime = UnixNanosecond
   259  		} else if strings.ToUpper(v) == "MILLI" {
   260  			field.AutoCreateTime = UnixMillisecond
   261  		} else {
   262  			field.AutoCreateTime = UnixSecond
   263  		}
   264  	}
   265  
   266  	if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok || (field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
   267  		if field.DataType == Time {
   268  			field.AutoUpdateTime = UnixTime
   269  		} else if strings.ToUpper(v) == "NANO" {
   270  			field.AutoUpdateTime = UnixNanosecond
   271  		} else if strings.ToUpper(v) == "MILLI" {
   272  			field.AutoUpdateTime = UnixMillisecond
   273  		} else {
   274  			field.AutoUpdateTime = UnixSecond
   275  		}
   276  	}
   277  
   278  	if val, ok := field.TagSettings["TYPE"]; ok {
   279  		switch DataType(strings.ToLower(val)) {
   280  		case Bool, Int, Uint, Float, String, Time, Bytes:
   281  			field.DataType = DataType(strings.ToLower(val))
   282  		default:
   283  			field.DataType = DataType(val)
   284  		}
   285  	}
   286  
   287  	if field.GORMDataType == "" {
   288  		field.GORMDataType = field.DataType
   289  	}
   290  
   291  	if field.Size == 0 {
   292  		switch reflect.Indirect(fieldValue).Kind() {
   293  		case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64, reflect.Float64:
   294  			field.Size = 64
   295  		case reflect.Int8, reflect.Uint8:
   296  			field.Size = 8
   297  		case reflect.Int16, reflect.Uint16:
   298  			field.Size = 16
   299  		case reflect.Int32, reflect.Uint32, reflect.Float32:
   300  			field.Size = 32
   301  		}
   302  	}
   303  
   304  	// setup permission
   305  	if val, ok := field.TagSettings["-"]; ok {
   306  		val = strings.ToLower(strings.TrimSpace(val))
   307  		switch val {
   308  		case "-":
   309  			field.Creatable = false
   310  			field.Updatable = false
   311  			field.Readable = false
   312  			field.DataType = ""
   313  		case "all":
   314  			field.Creatable = false
   315  			field.Updatable = false
   316  			field.Readable = false
   317  			field.DataType = ""
   318  			field.IgnoreMigration = true
   319  		case "migration":
   320  			field.IgnoreMigration = true
   321  		}
   322  	}
   323  
   324  	if v, ok := field.TagSettings["->"]; ok {
   325  		field.Creatable = false
   326  		field.Updatable = false
   327  		if strings.ToLower(v) == "false" {
   328  			field.Readable = false
   329  		} else {
   330  			field.Readable = true
   331  		}
   332  	}
   333  
   334  	if v, ok := field.TagSettings["<-"]; ok {
   335  		field.Creatable = true
   336  		field.Updatable = true
   337  
   338  		if v != "<-" {
   339  			if !strings.Contains(v, "create") {
   340  				field.Creatable = false
   341  			}
   342  
   343  			if !strings.Contains(v, "update") {
   344  				field.Updatable = false
   345  			}
   346  		}
   347  	}
   348  
   349  	if _, ok := field.TagSettings["EMBEDDED"]; ok || (fieldStruct.Anonymous && !isValuer && (field.Creatable || field.Updatable || field.Readable)) {
   350  		kind := reflect.Indirect(fieldValue).Kind()
   351  		switch kind {
   352  		case reflect.Struct:
   353  			var err error
   354  			field.Creatable = false
   355  			field.Updatable = false
   356  			field.Readable = false
   357  
   358  			cacheStore := &sync.Map{}
   359  			cacheStore.Store(embeddedCacheKey, true)
   360  			if field.EmbeddedSchema, err = getOrParse(fieldValue.Interface(), cacheStore, embeddedNamer{Table: schema.Table, Namer: schema.namer}); err != nil {
   361  				schema.err = err
   362  			}
   363  
   364  			for _, ef := range field.EmbeddedSchema.Fields {
   365  				ef.Schema = schema
   366  				ef.OwnerSchema = field.EmbeddedSchema
   367  				ef.BindNames = append([]string{fieldStruct.Name}, ef.BindNames...)
   368  				// index is negative means is pointer
   369  				if field.FieldType.Kind() == reflect.Struct {
   370  					ef.StructField.Index = append([]int{fieldStruct.Index[0]}, ef.StructField.Index...)
   371  				} else {
   372  					ef.StructField.Index = append([]int{-fieldStruct.Index[0] - 1}, ef.StructField.Index...)
   373  				}
   374  
   375  				if prefix, ok := field.TagSettings["EMBEDDEDPREFIX"]; ok && ef.DBName != "" {
   376  					ef.DBName = prefix + ef.DBName
   377  				}
   378  
   379  				if ef.PrimaryKey {
   380  					if val, ok := ef.TagSettings["PRIMARYKEY"]; ok && utils.CheckTruth(val) {
   381  						ef.PrimaryKey = true
   382  					} else if val, ok := ef.TagSettings["PRIMARY_KEY"]; ok && utils.CheckTruth(val) {
   383  						ef.PrimaryKey = true
   384  					} else {
   385  						ef.PrimaryKey = false
   386  
   387  						if val, ok := ef.TagSettings["AUTOINCREMENT"]; !ok || !utils.CheckTruth(val) {
   388  							ef.AutoIncrement = false
   389  						}
   390  
   391  						if ef.DefaultValue == "" {
   392  							ef.HasDefaultValue = false
   393  						}
   394  					}
   395  				}
   396  
   397  				for k, v := range field.TagSettings {
   398  					ef.TagSettings[k] = v
   399  				}
   400  			}
   401  		case reflect.Invalid, reflect.Uintptr, reflect.Array, reflect.Chan, reflect.Func, reflect.Interface,
   402  			reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer, reflect.Complex64, reflect.Complex128:
   403  			schema.err = fmt.Errorf("invalid embedded struct for %s's field %s, should be struct, but got %v", field.Schema.Name, field.Name, field.FieldType)
   404  		}
   405  	}
   406  
   407  	return field
   408  }
   409  
   410  // create valuer, setter when parse struct
   411  func (field *Field) setupValuerAndSetter() {
   412  	// ValueOf
   413  	switch {
   414  	case len(field.StructField.Index) == 1:
   415  		field.ValueOf = func(value reflect.Value) (interface{}, bool) {
   416  			fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0])
   417  			return fieldValue.Interface(), fieldValue.IsZero()
   418  		}
   419  	case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0:
   420  		field.ValueOf = func(value reflect.Value) (interface{}, bool) {
   421  			fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1])
   422  			return fieldValue.Interface(), fieldValue.IsZero()
   423  		}
   424  	default:
   425  		field.ValueOf = func(value reflect.Value) (interface{}, bool) {
   426  			v := reflect.Indirect(value)
   427  
   428  			for _, idx := range field.StructField.Index {
   429  				if idx >= 0 {
   430  					v = v.Field(idx)
   431  				} else {
   432  					v = v.Field(-idx - 1)
   433  
   434  					if v.Type().Elem().Kind() != reflect.Struct {
   435  						return nil, true
   436  					}
   437  
   438  					if !v.IsNil() {
   439  						v = v.Elem()
   440  					} else {
   441  						return nil, true
   442  					}
   443  				}
   444  			}
   445  			return v.Interface(), v.IsZero()
   446  		}
   447  	}
   448  
   449  	// ReflectValueOf
   450  	switch {
   451  	case len(field.StructField.Index) == 1:
   452  		field.ReflectValueOf = func(value reflect.Value) reflect.Value {
   453  			return reflect.Indirect(value).Field(field.StructField.Index[0])
   454  		}
   455  	case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0 && field.FieldType.Kind() != reflect.Ptr:
   456  		field.ReflectValueOf = func(value reflect.Value) reflect.Value {
   457  			return reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1])
   458  		}
   459  	default:
   460  		field.ReflectValueOf = func(value reflect.Value) reflect.Value {
   461  			v := reflect.Indirect(value)
   462  			for idx, fieldIdx := range field.StructField.Index {
   463  				if fieldIdx >= 0 {
   464  					v = v.Field(fieldIdx)
   465  				} else {
   466  					v = v.Field(-fieldIdx - 1)
   467  				}
   468  
   469  				if v.Kind() == reflect.Ptr {
   470  					if v.Type().Elem().Kind() == reflect.Struct {
   471  						if v.IsNil() {
   472  							v.Set(reflect.New(v.Type().Elem()))
   473  						}
   474  					}
   475  
   476  					if idx < len(field.StructField.Index)-1 {
   477  						v = v.Elem()
   478  					}
   479  				}
   480  			}
   481  			return v
   482  		}
   483  	}
   484  
   485  	fallbackSetter := func(value reflect.Value, v interface{}, setter func(reflect.Value, interface{}) error) (err error) {
   486  		if v == nil {
   487  			field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())
   488  		} else {
   489  			reflectV := reflect.ValueOf(v)
   490  			// Optimal value type acquisition for v
   491  			reflectValType := reflectV.Type()
   492  
   493  			if reflectValType.AssignableTo(field.FieldType) {
   494  				field.ReflectValueOf(value).Set(reflectV)
   495  				return
   496  			} else if reflectValType.ConvertibleTo(field.FieldType) {
   497  				field.ReflectValueOf(value).Set(reflectV.Convert(field.FieldType))
   498  				return
   499  			} else if field.FieldType.Kind() == reflect.Ptr {
   500  				fieldValue := field.ReflectValueOf(value)
   501  				fieldType := field.FieldType.Elem()
   502  
   503  				if reflectValType.AssignableTo(fieldType) {
   504  					if !fieldValue.IsValid() {
   505  						fieldValue = reflect.New(fieldType)
   506  					} else if fieldValue.IsNil() {
   507  						fieldValue.Set(reflect.New(fieldType))
   508  					}
   509  					fieldValue.Elem().Set(reflectV)
   510  					return
   511  				} else if reflectValType.ConvertibleTo(fieldType) {
   512  					if fieldValue.IsNil() {
   513  						fieldValue.Set(reflect.New(fieldType))
   514  					}
   515  
   516  					fieldValue.Elem().Set(reflectV.Convert(fieldType))
   517  					return
   518  				}
   519  			}
   520  
   521  			if reflectV.Kind() == reflect.Ptr {
   522  				if reflectV.IsNil() {
   523  					field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())
   524  				} else {
   525  					err = setter(value, reflectV.Elem().Interface())
   526  				}
   527  			} else if valuer, ok := v.(driver.Valuer); ok {
   528  				if v, err = valuer.Value(); err == nil {
   529  					err = setter(value, v)
   530  				}
   531  			} else {
   532  				return fmt.Errorf("failed to set value %+v to field %s", v, field.Name)
   533  			}
   534  		}
   535  
   536  		return
   537  	}
   538  
   539  	// Set
   540  	switch field.FieldType.Kind() {
   541  	case reflect.Bool:
   542  		field.Set = func(value reflect.Value, v interface{}) error {
   543  			switch data := v.(type) {
   544  			case bool:
   545  				field.ReflectValueOf(value).SetBool(data)
   546  			case *bool:
   547  				if data != nil {
   548  					field.ReflectValueOf(value).SetBool(*data)
   549  				} else {
   550  					field.ReflectValueOf(value).SetBool(false)
   551  				}
   552  			case int64:
   553  				if data > 0 {
   554  					field.ReflectValueOf(value).SetBool(true)
   555  				} else {
   556  					field.ReflectValueOf(value).SetBool(false)
   557  				}
   558  			case string:
   559  				b, _ := strconv.ParseBool(data)
   560  				field.ReflectValueOf(value).SetBool(b)
   561  			default:
   562  				return fallbackSetter(value, v, field.Set)
   563  			}
   564  			return nil
   565  		}
   566  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   567  		field.Set = func(value reflect.Value, v interface{}) (err error) {
   568  			switch data := v.(type) {
   569  			case int64:
   570  				field.ReflectValueOf(value).SetInt(data)
   571  			case int:
   572  				field.ReflectValueOf(value).SetInt(int64(data))
   573  			case int8:
   574  				field.ReflectValueOf(value).SetInt(int64(data))
   575  			case int16:
   576  				field.ReflectValueOf(value).SetInt(int64(data))
   577  			case int32:
   578  				field.ReflectValueOf(value).SetInt(int64(data))
   579  			case uint:
   580  				field.ReflectValueOf(value).SetInt(int64(data))
   581  			case uint8:
   582  				field.ReflectValueOf(value).SetInt(int64(data))
   583  			case uint16:
   584  				field.ReflectValueOf(value).SetInt(int64(data))
   585  			case uint32:
   586  				field.ReflectValueOf(value).SetInt(int64(data))
   587  			case uint64:
   588  				field.ReflectValueOf(value).SetInt(int64(data))
   589  			case float32:
   590  				field.ReflectValueOf(value).SetInt(int64(data))
   591  			case float64:
   592  				field.ReflectValueOf(value).SetInt(int64(data))
   593  			case []byte:
   594  				return field.Set(value, string(data))
   595  			case string:
   596  				if i, err := strconv.ParseInt(data, 0, 64); err == nil {
   597  					field.ReflectValueOf(value).SetInt(i)
   598  				} else {
   599  					return err
   600  				}
   601  			case time.Time:
   602  				if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond {
   603  					field.ReflectValueOf(value).SetInt(data.UnixNano())
   604  				} else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond {
   605  					field.ReflectValueOf(value).SetInt(data.UnixNano() / 1e6)
   606  				} else {
   607  					field.ReflectValueOf(value).SetInt(data.Unix())
   608  				}
   609  			case *time.Time:
   610  				if data != nil {
   611  					if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond {
   612  						field.ReflectValueOf(value).SetInt(data.UnixNano())
   613  					} else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond {
   614  						field.ReflectValueOf(value).SetInt(data.UnixNano() / 1e6)
   615  					} else {
   616  						field.ReflectValueOf(value).SetInt(data.Unix())
   617  					}
   618  				} else {
   619  					field.ReflectValueOf(value).SetInt(0)
   620  				}
   621  			default:
   622  				return fallbackSetter(value, v, field.Set)
   623  			}
   624  			return err
   625  		}
   626  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
   627  		field.Set = func(value reflect.Value, v interface{}) (err error) {
   628  			switch data := v.(type) {
   629  			case uint64:
   630  				field.ReflectValueOf(value).SetUint(data)
   631  			case uint:
   632  				field.ReflectValueOf(value).SetUint(uint64(data))
   633  			case uint8:
   634  				field.ReflectValueOf(value).SetUint(uint64(data))
   635  			case uint16:
   636  				field.ReflectValueOf(value).SetUint(uint64(data))
   637  			case uint32:
   638  				field.ReflectValueOf(value).SetUint(uint64(data))
   639  			case int64:
   640  				field.ReflectValueOf(value).SetUint(uint64(data))
   641  			case int:
   642  				field.ReflectValueOf(value).SetUint(uint64(data))
   643  			case int8:
   644  				field.ReflectValueOf(value).SetUint(uint64(data))
   645  			case int16:
   646  				field.ReflectValueOf(value).SetUint(uint64(data))
   647  			case int32:
   648  				field.ReflectValueOf(value).SetUint(uint64(data))
   649  			case float32:
   650  				field.ReflectValueOf(value).SetUint(uint64(data))
   651  			case float64:
   652  				field.ReflectValueOf(value).SetUint(uint64(data))
   653  			case []byte:
   654  				return field.Set(value, string(data))
   655  			case time.Time:
   656  				if field.AutoCreateTime == UnixNanosecond || field.AutoUpdateTime == UnixNanosecond {
   657  					field.ReflectValueOf(value).SetUint(uint64(data.UnixNano()))
   658  				} else if field.AutoCreateTime == UnixMillisecond || field.AutoUpdateTime == UnixMillisecond {
   659  					field.ReflectValueOf(value).SetUint(uint64(data.UnixNano() / 1e6))
   660  				} else {
   661  					field.ReflectValueOf(value).SetUint(uint64(data.Unix()))
   662  				}
   663  			case string:
   664  				if i, err := strconv.ParseUint(data, 0, 64); err == nil {
   665  					field.ReflectValueOf(value).SetUint(i)
   666  				} else {
   667  					return err
   668  				}
   669  			default:
   670  				return fallbackSetter(value, v, field.Set)
   671  			}
   672  			return err
   673  		}
   674  	case reflect.Float32, reflect.Float64:
   675  		field.Set = func(value reflect.Value, v interface{}) (err error) {
   676  			switch data := v.(type) {
   677  			case float64:
   678  				field.ReflectValueOf(value).SetFloat(data)
   679  			case float32:
   680  				field.ReflectValueOf(value).SetFloat(float64(data))
   681  			case int64:
   682  				field.ReflectValueOf(value).SetFloat(float64(data))
   683  			case int:
   684  				field.ReflectValueOf(value).SetFloat(float64(data))
   685  			case int8:
   686  				field.ReflectValueOf(value).SetFloat(float64(data))
   687  			case int16:
   688  				field.ReflectValueOf(value).SetFloat(float64(data))
   689  			case int32:
   690  				field.ReflectValueOf(value).SetFloat(float64(data))
   691  			case uint:
   692  				field.ReflectValueOf(value).SetFloat(float64(data))
   693  			case uint8:
   694  				field.ReflectValueOf(value).SetFloat(float64(data))
   695  			case uint16:
   696  				field.ReflectValueOf(value).SetFloat(float64(data))
   697  			case uint32:
   698  				field.ReflectValueOf(value).SetFloat(float64(data))
   699  			case uint64:
   700  				field.ReflectValueOf(value).SetFloat(float64(data))
   701  			case []byte:
   702  				return field.Set(value, string(data))
   703  			case string:
   704  				if i, err := strconv.ParseFloat(data, 64); err == nil {
   705  					field.ReflectValueOf(value).SetFloat(i)
   706  				} else {
   707  					return err
   708  				}
   709  			default:
   710  				return fallbackSetter(value, v, field.Set)
   711  			}
   712  			return err
   713  		}
   714  	case reflect.String:
   715  		field.Set = func(value reflect.Value, v interface{}) (err error) {
   716  			switch data := v.(type) {
   717  			case string:
   718  				field.ReflectValueOf(value).SetString(data)
   719  			case []byte:
   720  				field.ReflectValueOf(value).SetString(string(data))
   721  			case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
   722  				field.ReflectValueOf(value).SetString(utils.ToString(data))
   723  			case float64, float32:
   724  				field.ReflectValueOf(value).SetString(fmt.Sprintf("%."+strconv.Itoa(field.Precision)+"f", data))
   725  			default:
   726  				return fallbackSetter(value, v, field.Set)
   727  			}
   728  			return err
   729  		}
   730  	default:
   731  		fieldValue := reflect.New(field.FieldType)
   732  		switch fieldValue.Elem().Interface().(type) {
   733  		case time.Time:
   734  			field.Set = func(value reflect.Value, v interface{}) error {
   735  				switch data := v.(type) {
   736  				case time.Time:
   737  					field.ReflectValueOf(value).Set(reflect.ValueOf(v))
   738  				case *time.Time:
   739  					if data != nil {
   740  						field.ReflectValueOf(value).Set(reflect.ValueOf(data).Elem())
   741  					} else {
   742  						field.ReflectValueOf(value).Set(reflect.ValueOf(time.Time{}))
   743  					}
   744  				case string:
   745  					if t, err := now.Parse(data); err == nil {
   746  						field.ReflectValueOf(value).Set(reflect.ValueOf(t))
   747  					} else {
   748  						return fmt.Errorf("failed to set string %v to time.Time field %s, failed to parse it as time, got error %v", v, field.Name, err)
   749  					}
   750  				default:
   751  					return fallbackSetter(value, v, field.Set)
   752  				}
   753  				return nil
   754  			}
   755  		case *time.Time:
   756  			field.Set = func(value reflect.Value, v interface{}) error {
   757  				switch data := v.(type) {
   758  				case time.Time:
   759  					fieldValue := field.ReflectValueOf(value)
   760  					if fieldValue.IsNil() {
   761  						fieldValue.Set(reflect.New(field.FieldType.Elem()))
   762  					}
   763  					fieldValue.Elem().Set(reflect.ValueOf(v))
   764  				case *time.Time:
   765  					field.ReflectValueOf(value).Set(reflect.ValueOf(v))
   766  				case string:
   767  					if t, err := now.Parse(data); err == nil {
   768  						fieldValue := field.ReflectValueOf(value)
   769  						if fieldValue.IsNil() {
   770  							if v == "" {
   771  								return nil
   772  							}
   773  							fieldValue.Set(reflect.New(field.FieldType.Elem()))
   774  						}
   775  						fieldValue.Elem().Set(reflect.ValueOf(t))
   776  					} else {
   777  						return fmt.Errorf("failed to set string %v to time.Time field %s, failed to parse it as time, got error %v", v, field.Name, err)
   778  					}
   779  				default:
   780  					return fallbackSetter(value, v, field.Set)
   781  				}
   782  				return nil
   783  			}
   784  		default:
   785  			if _, ok := fieldValue.Elem().Interface().(sql.Scanner); ok {
   786  				// pointer scanner
   787  				field.Set = func(value reflect.Value, v interface{}) (err error) {
   788  					reflectV := reflect.ValueOf(v)
   789  					if !reflectV.IsValid() {
   790  						field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())
   791  					} else if reflectV.Type().AssignableTo(field.FieldType) {
   792  						field.ReflectValueOf(value).Set(reflectV)
   793  					} else if reflectV.Kind() == reflect.Ptr {
   794  						if reflectV.IsNil() || !reflectV.IsValid() {
   795  							field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())
   796  						} else {
   797  							return field.Set(value, reflectV.Elem().Interface())
   798  						}
   799  					} else {
   800  						fieldValue := field.ReflectValueOf(value)
   801  						if fieldValue.IsNil() {
   802  							fieldValue.Set(reflect.New(field.FieldType.Elem()))
   803  						}
   804  
   805  						if valuer, ok := v.(driver.Valuer); ok {
   806  							v, _ = valuer.Value()
   807  						}
   808  
   809  						err = fieldValue.Interface().(sql.Scanner).Scan(v)
   810  					}
   811  					return
   812  				}
   813  			} else if _, ok := fieldValue.Interface().(sql.Scanner); ok {
   814  				// struct scanner
   815  				field.Set = func(value reflect.Value, v interface{}) (err error) {
   816  					reflectV := reflect.ValueOf(v)
   817  					if !reflectV.IsValid() {
   818  						field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())
   819  					} else if reflectV.Type().AssignableTo(field.FieldType) {
   820  						field.ReflectValueOf(value).Set(reflectV)
   821  					} else if reflectV.Kind() == reflect.Ptr {
   822  						if reflectV.IsNil() || !reflectV.IsValid() {
   823  							field.ReflectValueOf(value).Set(reflect.New(field.FieldType).Elem())
   824  						} else {
   825  							return field.Set(value, reflectV.Elem().Interface())
   826  						}
   827  					} else {
   828  						if valuer, ok := v.(driver.Valuer); ok {
   829  							v, _ = valuer.Value()
   830  						}
   831  
   832  						err = field.ReflectValueOf(value).Addr().Interface().(sql.Scanner).Scan(v)
   833  					}
   834  					return
   835  				}
   836  			} else {
   837  				field.Set = func(value reflect.Value, v interface{}) (err error) {
   838  					return fallbackSetter(value, v, field.Set)
   839  				}
   840  			}
   841  		}
   842  	}
   843  }