dialect/sqlscan: add interface{} scanning support

Summary: Pull Request resolved: https://github.com/facebookincubator/ent/pull/223

Reviewed By: alexsn

Differential Revision: D18878581

fbshipit-source-id: 4a60ceea6c092f065e52e6b3bb625487451a815d
This commit is contained in:
Ariel Mashraki
2019-12-08 21:58:32 -08:00
committed by Facebook Github Bot
parent 0fb33aaa5e
commit f65cf5150e
2 changed files with 21 additions and 0 deletions

View File

@@ -98,6 +98,8 @@ func (r *rowScan) values() []interface{} {
// scanType returns rowScan for the given reflect.Type.
func scanType(typ reflect.Type, columns []string) (*rowScan, error) {
switch k := typ.Kind(); {
case k == reflect.Interface && typ.NumMethod() == 0:
fallthrough // interface{}
case k == reflect.String || k >= reflect.Bool && k <= reflect.Float64:
return &rowScan{
columns: []reflect.Type{typ},

View File

@@ -6,6 +6,7 @@ package sql
import (
"database/sql"
"database/sql/driver"
"testing"
"github.com/DATA-DOG/go-sqlmock"
@@ -139,6 +140,24 @@ func TestScanInt64(t *testing.T) {
require.EqualValues(t, 10, n)
}
func TestInterface(t *testing.T) {
mock := sqlmock.NewRows([]string{"age"}).
AddRow("10").
AddRow("20")
var values []driver.Value
err := ScanSlice(toRows(mock), &values)
require.NoError(t, err)
require.Equal(t, []driver.Value{"10", "20"}, values)
mock = sqlmock.NewRows([]string{"age"}).
AddRow(10).
AddRow(20)
values = values[:0:0]
err = ScanSlice(toRows(mock), &values)
require.NoError(t, err)
require.Equal(t, []driver.Value{int64(10), int64(20)}, values)
}
func toRows(mrows *sqlmock.Rows) *sql.Rows {
db, mock, _ := sqlmock.New()
mock.ExpectQuery("").WillReturnRows(mrows)