From e7ce44adb16514efeb941fc747c5f9254995b619 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Thu, 27 Oct 2022 22:52:50 +0300 Subject: [PATCH] dialect/sql: support mapping non-lowercased tags --- dialect/sql/scan.go | 13 +++++++++---- dialect/sql/scan_test.go | 11 +++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/dialect/sql/scan.go b/dialect/sql/scan.go index 597824673..20ab1f58e 100644 --- a/dialect/sql/scan.go +++ b/dialect/sql/scan.go @@ -213,10 +213,15 @@ func scanStruct(typ reflect.Type, columns []string) (*rowScan, error) { names[columnName(f)] = []int{i} } for _, c := range columns { - // Normalize columns if necessary, for example: COUNT(*) => count. - name := strings.ToLower(strings.Split(c, "(")[0]) - idx, ok := names[name] - if !ok { + var idx []int + // Normalize columns if necessary, + // for example: COUNT(*) => count. + switch name := strings.Split(c, "(")[0]; { + case names[name] != nil: + idx = names[name] + case names[strings.ToLower(name)] != nil: + idx = names[strings.ToLower(name)] + default: return nil, fmt.Errorf("sql/scan: missing struct field for column: %s (%s)", c, name) } idxs = append(idxs, idx) diff --git a/dialect/sql/scan_test.go b/dialect/sql/scan_test.go index f66c22eb2..0afed50db 100644 --- a/dialect/sql/scan_test.go +++ b/dialect/sql/scan_test.go @@ -140,6 +140,17 @@ func TestScanSlice(t *testing.T) { require.Empty(t, pp) } +func TestScanSlice_CamelTags(t *testing.T) { + mock := sqlmock.NewRows([]string{"nickName"}). + AddRow("foo"). + AddRow("bar") + var v []*struct { + NickName string `json:"nickName"` + } + require.NoError(t, ScanSlice(toRows(mock), &v)) + require.Equal(t, "foo", v[0].NickName) +} + func TestScanJSON(t *testing.T) { mock := sqlmock.NewRows([]string{"v", "p"}). AddRow([]byte(`{"i": 1, "s":"a8m"}`), []byte(`{"i": 1, "s":"a8m"}`)).