diff --git a/dialect/sql/scan.go b/dialect/sql/scan.go index b866c1889..867d2e28c 100644 --- a/dialect/sql/scan.go +++ b/dialect/sql/scan.go @@ -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 diff --git a/dialect/sql/scan_test.go b/dialect/sql/scan_test.go index ef9a98dfa..08036f18f 100644 --- a/dialect/sql/scan_test.go +++ b/dialect/sql/scan_test.go @@ -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) {