dialect/sql: support mapping non-lowercased tags

This commit is contained in:
Ariel Mashraki
2022-10-27 22:52:50 +03:00
committed by Ariel Mashraki
parent f1223dc879
commit e7ce44adb1
2 changed files with 20 additions and 4 deletions

View File

@@ -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)

View File

@@ -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"}`)).