diff --git a/main_test.go b/main_test.go index 33503b3d..eb11ddb0 100644 --- a/main_test.go +++ b/main_test.go @@ -232,7 +232,9 @@ func TestSqlNullValue(t *testing.T) { DB.DropTable(&NullValue{}) DB.AutoMigrate(&NullValue{}) - if err := DB.Save(&NullValue{Name: sql.NullString{String: "hello", Valid: true}, + if err := DB.Save(&NullValue{ + Name: sql.NullString{String: "hello", Valid: true}, + Gender: &sql.NullString{String: "M", Valid: true}, Age: sql.NullInt64{Int64: 18, Valid: true}, Male: sql.NullBool{Bool: true, Valid: true}, Height: sql.NullFloat64{Float64: 100.11, Valid: true}, @@ -244,11 +246,13 @@ func TestSqlNullValue(t *testing.T) { var nv NullValue DB.First(&nv, "name = ?", "hello") - if nv.Name.String != "hello" || nv.Age.Int64 != 18 || nv.Male.Bool != true || nv.Height.Float64 != 100.11 || nv.AddedAt.Valid != true { + if nv.Name.String != "hello" || nv.Gender.String != "M" || nv.Age.Int64 != 18 || nv.Male.Bool != true || nv.Height.Float64 != 100.11 || nv.AddedAt.Valid != true { t.Errorf("Should be able to fetch null value") } - if err := DB.Save(&NullValue{Name: sql.NullString{String: "hello-2", Valid: true}, + if err := DB.Save(&NullValue{ + Name: sql.NullString{String: "hello-2", Valid: true}, + Gender: &sql.NullString{String: "F", Valid: true}, Age: sql.NullInt64{Int64: 18, Valid: false}, Male: sql.NullBool{Bool: true, Valid: true}, Height: sql.NullFloat64{Float64: 100.11, Valid: true}, @@ -259,11 +263,13 @@ func TestSqlNullValue(t *testing.T) { var nv2 NullValue DB.First(&nv2, "name = ?", "hello-2") - if nv2.Name.String != "hello-2" || nv2.Age.Int64 != 0 || nv2.Male.Bool != true || nv2.Height.Float64 != 100.11 || nv2.AddedAt.Valid != false { + if nv2.Name.String != "hello-2" || nv2.Gender.String != "F" || nv2.Age.Int64 != 0 || nv2.Male.Bool != true || nv2.Height.Float64 != 100.11 || nv2.AddedAt.Valid != false { t.Errorf("Should be able to fetch null value") } - if err := DB.Save(&NullValue{Name: sql.NullString{String: "hello-3", Valid: false}, + if err := DB.Save(&NullValue{ + Name: sql.NullString{String: "hello-3", Valid: false}, + Gender: &sql.NullString{String: "M", Valid: true}, Age: sql.NullInt64{Int64: 18, Valid: false}, Male: sql.NullBool{Bool: true, Valid: true}, Height: sql.NullFloat64{Float64: 100.11, Valid: true}, diff --git a/model_struct.go b/model_struct.go index 16032f06..fd7f1324 100644 --- a/model_struct.go +++ b/model_struct.go @@ -166,16 +166,18 @@ func (scope *Scope) GetModelStruct() *ModelStruct { field.HasDefaultValue = true } - fieldValue := reflect.New(fieldStruct.Type).Interface() + indirectType := fieldStruct.Type + for indirectType.Kind() == reflect.Ptr { + indirectType = indirectType.Elem() + } + + fieldValue := reflect.New(indirectType).Interface() if _, isScanner := fieldValue.(sql.Scanner); isScanner { // is scanner field.IsScanner, field.IsNormal = true, true } else if _, isTime := fieldValue.(*time.Time); isTime { // is time field.IsNormal = true - } else if _, isTime := fieldValue.(**time.Time); isTime { - // is time - field.IsNormal = true } else if _, ok := field.TagSettings["EMBEDDED"]; ok || fieldStruct.Anonymous { // is embedded struct for _, subField := range scope.New(fieldValue).GetStructFields() { @@ -189,11 +191,6 @@ func (scope *Scope) GetModelStruct() *ModelStruct { continue } else { // build relationships - indirectType := fieldStruct.Type - for indirectType.Kind() == reflect.Ptr { - indirectType = indirectType.Elem() - } - switch indirectType.Kind() { case reflect.Slice: defer func(field *StructField) { diff --git a/structs_test.go b/structs_test.go index 9a9b23d1..a3dfa8b1 100644 --- a/structs_test.go +++ b/structs_test.go @@ -168,7 +168,8 @@ type Comment struct { // Scanner type NullValue struct { Id int64 - Name sql.NullString `sql:"not null"` + Name sql.NullString `sql:"not null"` + Gender *sql.NullString `sql:"not null"` Age sql.NullInt64 Male sql.NullBool Height sql.NullFloat64