解码器合并到数据集中

This commit is contained in:
huanghua_2017
2019-02-01 15:05:17 +08:00
parent c7eaa17582
commit e13e6cbca5
2 changed files with 16 additions and 28 deletions

View File

@@ -26,6 +26,9 @@ type DBResult struct {
LastInsertID int64 LastInsertID int64
RowsAffected int64 RowsAffected int64
res *sql.Rows res *sql.Rows
// 解码数据相关设置
tag string
blur bool
} }
// Next ... // Next ...
@@ -44,39 +47,24 @@ func (slf *DBResult) Scan(arg ...interface{}) error {
return slf.res.Scan(arg...) return slf.res.Scan(arg...)
} }
// SQLDecoder ...
type SQLDecoder struct {
res DBResult
tag string
strict bool
}
// NewSQLDecoder ...
func NewSQLDecoder(res DBResult) *SQLDecoder {
return &SQLDecoder{
res: res,
tag: "col",
}
}
// SetSpecificTag ... // SetSpecificTag ...
func (slf *SQLDecoder) SetSpecificTag(tag string) *SQLDecoder { func (slf *DBResult) SetSpecificTag(tag string) *DBResult {
slf.tag = tag slf.tag = tag
return slf return slf
} }
// SetStrictMode ... // SetBlurMode ...
func (slf *SQLDecoder) SetStrictMode(strict bool) *SQLDecoder { func (slf *DBResult) SetBlurMode(blur bool) *DBResult {
slf.strict = strict slf.blur = blur
return slf return slf
} }
// UnMarshal ... // UnMarshal ...
func (slf *SQLDecoder) UnMarshal(out interface{}) error { func (slf *DBResult) UnMarshal(out interface{}) error {
if slf.res.Err != nil { if slf.Err != nil {
return slf.res.Err return slf.Err
} }
tbm, err := dbResult2Map(slf.res.res) tbm, err := dbResult2Map(slf.res)
if err != nil { if err != nil {
return err return err
} }
@@ -123,7 +111,7 @@ func dbResult2Map(rows *sql.Rows) ([]map[string]string, error) {
return tableData, nil return tableData, nil
} }
func (slf *SQLDecoder) mapSingle2interface(m map[string]string, v reflect.Value) error { func (slf *DBResult) mapSingle2interface(m map[string]string, v reflect.Value) error {
t := v.Type() t := v.Type()
val := v.Elem() val := v.Elem()
typ := t.Elem() typ := t.Elem()
@@ -144,7 +132,7 @@ func (slf *SQLDecoder) mapSingle2interface(m map[string]string, v reflect.Value)
vtag := strings.Split(strings.ToLower(tag), ",") vtag := strings.Split(strings.ToLower(tag), ",")
meta, ok := m[vtag[0]] meta, ok := m[vtag[0]]
if !ok { if !ok {
if slf.strict { if !slf.blur {
return fmt.Errorf("没有在结果集中找到对应的字段 %s", tag) return fmt.Errorf("没有在结果集中找到对应的字段 %s", tag)
} }
continue continue
@@ -190,7 +178,7 @@ func (slf *SQLDecoder) mapSingle2interface(m map[string]string, v reflect.Value)
return nil return nil
} }
func (slf *SQLDecoder) mapSlice2interface(data []map[string]string, in interface{}) error { func (slf *DBResult) mapSlice2interface(data []map[string]string, in interface{}) error {
length := len(data) length := len(data)
if length > 0 { if length > 0 {

View File

@@ -24,9 +24,9 @@ func TestDBModule(t *testing.T) {
Addtime int64 `json:"addtime"` Addtime int64 `json:"addtime"`
Tname string `json:"tname"` Tname string `json:"tname"`
Uuid string `json:"uuid,omitempty"` Uuid string `json:"uuid,omitempty"`
AAAA string `json:"-"` AAAA string `json:"xxx"`
}{} }{}
err := sysmodule.NewSQLDecoder(res).SetSpecificTag("json").SetStrictMode(true).UnMarshal(&out) err := res.SetSpecificTag("json").SetBlurMode(false).UnMarshal(&out)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }