Add EmptyScanner

This commit is contained in:
Lunny Xiao 2021-06-25 17:42:54 +08:00
parent 257fea90c6
commit 004408dd44
2 changed files with 9 additions and 8 deletions

15
scan.go
View File

@ -121,8 +121,8 @@ func genScanResultsByBean(bean interface{}) (interface{}, bool, error) {
} }
} }
// genRowsScanResults generating scan results according column types // genScanResults generating scan results according column types
func genRowsScanResults(driver dialects.Driver, rows *core.Rows, types []*sql.ColumnType) ([]interface{}, error) { func genScanResults(driver dialects.Driver, types []*sql.ColumnType) ([]interface{}, error) {
var scanResults = make([]interface{}, len(types)) var scanResults = make([]interface{}, len(types))
var err error var err error
for i, t := range types { for i, t := range types {
@ -156,13 +156,13 @@ func row2mapStr(rows *core.Rows, types []*sql.ColumnType, fields []string) (map[
return result, nil return result, nil
} }
func genColScanResult(driver dialects.Driver, fieldType reflect.Type, columnType *sql.ColumnType) (interface{}, error) { func genScanResult(driver dialects.Driver, fieldType reflect.Type, columnType *sql.ColumnType) (interface{}, error) {
if fieldType.Implements(scannerType) || fieldType.Implements(conversionType) { if fieldType.Implements(scannerType) || fieldType.Implements(conversionType) {
return &sql.RawBytes{}, nil return &sql.RawBytes{}, nil
} }
switch fieldType.Kind() { switch fieldType.Kind() {
case reflect.Ptr: case reflect.Ptr:
return genColScanResult(driver, fieldType.Elem(), columnType) return genScanResult(driver, fieldType.Elem(), columnType)
case reflect.Array, reflect.Slice: case reflect.Array, reflect.Slice:
return &sql.RawBytes{}, nil return &sql.RawBytes{}, nil
default: default:
@ -170,15 +170,16 @@ func genColScanResult(driver dialects.Driver, fieldType reflect.Type, columnType
} }
} }
func genScanResults(driver dialects.Driver, types []*sql.ColumnType, fields []string, table *schemas.Table) ([]interface{}, error) { func genScanResultsWithTable(driver dialects.Driver, types []*sql.ColumnType, fields []string, table *schemas.Table) ([]interface{}, error) {
var scanResults = make([]interface{}, 0, len(types)) var scanResults = make([]interface{}, 0, len(types))
for i, tp := range types { for i, tp := range types {
col := table.GetColumn(fields[i]) col := table.GetColumn(fields[i])
if col == nil { if col == nil {
scanResults = append(scanResults, &sql.RawBytes{}) // the column scanned from database but will be ignored by the table, so just use emptyscanner
scanResults = append(scanResults, &EmptyScanner{})
continue continue
} }
scanResult, err := genColScanResult(driver, col.Type, tp) scanResult, err := genScanResult(driver, col.Type, tp)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -423,7 +423,7 @@ func (session *Session) row2Slice(rows *core.Rows, types []*sql.ColumnType, fiel
closure(bean) closure(bean)
} }
scanResults, err := genScanResults(session.engine.driver, types, fields, table) scanResults, err := genScanResultsWithTable(session.engine.driver, types, fields, table)
if err != nil { if err != nil {
return nil, err return nil, err
} }