mirror of
https://github.com/astaxie/beego.git
synced 2025-07-02 20:10:19 +00:00
add support for sql.Null* types
Change instructions for sqlite3 tests to use in memory db for much faster
This commit is contained in:
111
orm/db.go
111
orm/db.go
@ -103,15 +103,36 @@ func (d *dbBase) collectFieldValue(mi *modelInfo, fi *fieldInfo, ind reflect.Val
|
||||
} else {
|
||||
switch fi.fieldType {
|
||||
case TypeBooleanField:
|
||||
value = field.Bool()
|
||||
case TypeCharField, TypeTextField:
|
||||
value = field.String()
|
||||
case TypeFloatField, TypeDecimalField:
|
||||
vu := field.Interface()
|
||||
if _, ok := vu.(float32); ok {
|
||||
value, _ = StrTo(ToStr(vu)).Float64()
|
||||
if nb, ok := field.Interface().(sql.NullBool); ok {
|
||||
value = nil
|
||||
if nb.Valid {
|
||||
value = nb.Bool
|
||||
}
|
||||
} else {
|
||||
value = field.Float()
|
||||
value = field.Bool()
|
||||
}
|
||||
case TypeCharField, TypeTextField:
|
||||
if ns, ok := field.Interface().(sql.NullString); ok {
|
||||
value = nil
|
||||
if ns.Valid {
|
||||
value = ns.String
|
||||
}
|
||||
} else {
|
||||
value = field.String()
|
||||
}
|
||||
case TypeFloatField, TypeDecimalField:
|
||||
if nf, ok := field.Interface().(sql.NullFloat64); ok {
|
||||
value = nil
|
||||
if nf.Valid {
|
||||
value = nf.Float64
|
||||
}
|
||||
} else {
|
||||
vu := field.Interface()
|
||||
if _, ok := vu.(float32); ok {
|
||||
value, _ = StrTo(ToStr(vu)).Float64()
|
||||
} else {
|
||||
value = field.Float()
|
||||
}
|
||||
}
|
||||
case TypeDateField, TypeDateTimeField:
|
||||
value = field.Interface()
|
||||
@ -124,7 +145,14 @@ func (d *dbBase) collectFieldValue(mi *modelInfo, fi *fieldInfo, ind reflect.Val
|
||||
case fi.fieldType&IsPostiveIntegerField > 0:
|
||||
value = field.Uint()
|
||||
case fi.fieldType&IsIntegerField > 0:
|
||||
value = field.Int()
|
||||
if ni, ok := field.Interface().(sql.NullInt64); ok {
|
||||
value = nil
|
||||
if ni.Valid {
|
||||
value = ni.Int64
|
||||
}
|
||||
} else {
|
||||
value = field.Int()
|
||||
}
|
||||
case fi.fieldType&IsRelField > 0:
|
||||
if field.IsNil() {
|
||||
value = nil
|
||||
@ -1122,17 +1150,37 @@ setValue:
|
||||
switch {
|
||||
case fieldType == TypeBooleanField:
|
||||
if isNative {
|
||||
if value == nil {
|
||||
value = false
|
||||
if nb, ok := field.Interface().(sql.NullBool); ok {
|
||||
if value == nil {
|
||||
nb.Valid = false
|
||||
} else {
|
||||
nb.Bool = value.(bool)
|
||||
nb.Valid = true
|
||||
}
|
||||
field.Set(reflect.ValueOf(nb))
|
||||
} else {
|
||||
if value == nil {
|
||||
value = false
|
||||
}
|
||||
field.SetBool(value.(bool))
|
||||
}
|
||||
field.SetBool(value.(bool))
|
||||
}
|
||||
case fieldType == TypeCharField || fieldType == TypeTextField:
|
||||
if isNative {
|
||||
if value == nil {
|
||||
value = ""
|
||||
if ns, ok := field.Interface().(sql.NullString); ok {
|
||||
if value == nil {
|
||||
ns.Valid = false
|
||||
} else {
|
||||
ns.String = value.(string)
|
||||
ns.Valid = true
|
||||
}
|
||||
field.Set(reflect.ValueOf(ns))
|
||||
} else {
|
||||
if value == nil {
|
||||
value = ""
|
||||
}
|
||||
field.SetString(value.(string))
|
||||
}
|
||||
field.SetString(value.(string))
|
||||
}
|
||||
case fieldType == TypeDateField || fieldType == TypeDateTimeField:
|
||||
if isNative {
|
||||
@ -1151,18 +1199,39 @@ setValue:
|
||||
}
|
||||
} else {
|
||||
if isNative {
|
||||
if value == nil {
|
||||
value = int64(0)
|
||||
if ni, ok := field.Interface().(sql.NullInt64); ok {
|
||||
if value == nil {
|
||||
ni.Valid = false
|
||||
} else {
|
||||
ni.Int64 = value.(int64)
|
||||
ni.Valid = true
|
||||
}
|
||||
field.Set(reflect.ValueOf(ni))
|
||||
} else {
|
||||
if value == nil {
|
||||
value = int64(0)
|
||||
}
|
||||
field.SetInt(value.(int64))
|
||||
}
|
||||
field.SetInt(value.(int64))
|
||||
}
|
||||
}
|
||||
case fieldType == TypeFloatField || fieldType == TypeDecimalField:
|
||||
if isNative {
|
||||
if value == nil {
|
||||
value = float64(0)
|
||||
if nf, ok := field.Interface().(sql.NullFloat64); ok {
|
||||
if value == nil {
|
||||
nf.Valid = false
|
||||
} else {
|
||||
nf.Float64 = value.(float64)
|
||||
nf.Valid = true
|
||||
}
|
||||
field.Set(reflect.ValueOf(nf))
|
||||
} else {
|
||||
|
||||
if value == nil {
|
||||
value = float64(0)
|
||||
}
|
||||
field.SetFloat(value.(float64))
|
||||
}
|
||||
field.SetFloat(value.(float64))
|
||||
}
|
||||
case fieldType&IsRelField > 0:
|
||||
if value != nil {
|
||||
|
Reference in New Issue
Block a user