dialect/sql/sqlscan: skip unexported struct fields

This commit is contained in:
Ariel Mashraki
2021-01-09 18:01:02 +02:00
committed by Ariel Mashraki
parent 9dd3933919
commit 727e41e357
2 changed files with 15 additions and 2 deletions

View File

@@ -179,6 +179,10 @@ func scanStruct(typ reflect.Type, columns []string) (*rowScan, error) {
)
for i := 0; i < typ.NumField(); i++ {
f := typ.Field(i)
// Skip unexported fields.
if f.PkgPath != "" {
continue
}
name := strings.ToLower(f.Name)
if tag, ok := f.Tag.Lookup("sql"); ok {
name = tag

View File

@@ -116,18 +116,27 @@ func TestScanSlice(t *testing.T) {
AddRow(10, "Ariel", "Mashraki")
err := ScanSlice(toRows(mock), nil)
require.EqualError(t, err, "sql/scan: ScanSlice(nil)")
var p []struct {
type P struct {
_ int
ID int
First string
Last string
}
var p []P
err = ScanSlice(toRows(mock), p)
require.EqualError(t, err, "sql/scan: ScanSlice(non-pointer []struct { _ int; ID int; First string; Last string })")
require.EqualError(t, err, "sql/scan: ScanSlice(non-pointer []sql.P)")
require.NoError(t, ScanSlice(toRows(mock), &p))
require.Equal(t, 10, p[0].ID)
require.Equal(t, "Ariel", p[0].First)
require.Equal(t, "Mashraki", p[0].Last)
var pp []struct{ _, id int }
mock = sqlmock.NewRows([]string{"id"}).
AddRow(10)
err = ScanSlice(toRows(mock), &pp)
require.EqualError(t, err, "sql/scan: missing struct field for column: id (id)")
require.Empty(t, pp)
}
func TestScanSlicePtr(t *testing.T) {