mirror of
https://github.com/zeromicro/go-zero.git
synced 2025-02-03 00:38:40 +08:00
chore: refactor orm code (#3015)
This commit is contained in:
parent
e735915d89
commit
cca45be3c5
@ -34,18 +34,21 @@ func getTaggedFieldValueMap(v reflect.Value) (map[string]any, error) {
|
|||||||
result := make(map[string]any, size)
|
result := make(map[string]any, size)
|
||||||
|
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
if (rt.Field(i).Type.Kind() == reflect.Struct || rt.Field(i).Type.Kind() == reflect.Ptr) && rt.Field(i).Anonymous {
|
field := rt.Field(i)
|
||||||
r, e := getTaggedFieldValueMap(reflect.Indirect(v).Field(i))
|
if field.Anonymous && mapping.Deref(field.Type).Kind() == reflect.Struct {
|
||||||
if e != nil {
|
inner, err := getTaggedFieldValueMap(reflect.Indirect(v).Field(i))
|
||||||
return nil, e
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
for i2, i3 := range r {
|
|
||||||
result[i2] = i3
|
for key, val := range inner {
|
||||||
|
result[key] = val
|
||||||
}
|
}
|
||||||
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
key := parseTagName(rt.Field(i))
|
key := parseTagName(field)
|
||||||
if len(key) == 0 {
|
if len(key) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -125,7 +128,7 @@ func parseTagName(field reflect.StructField) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
options := strings.Split(key, ",")
|
options := strings.Split(key, ",")
|
||||||
return options[0]
|
return strings.TrimSpace(options[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
func unmarshalRow(v any, scanner rowsScanner, strict bool) error {
|
func unmarshalRow(v any, scanner rowsScanner, strict bool) error {
|
||||||
|
@ -1069,19 +1069,19 @@ func TestAnonymousStructPr(t *testing.T) {
|
|||||||
String: "",
|
String: "",
|
||||||
Valid: false,
|
Valid: false,
|
||||||
},
|
},
|
||||||
ClassName: "实验班",
|
ClassName: "experimental class",
|
||||||
Discipline: "数学",
|
Discipline: "math",
|
||||||
Score: 100,
|
Score: 100,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "second",
|
Name: "second",
|
||||||
Age: 3,
|
Age: 3,
|
||||||
Grade: sql.NullString{
|
Grade: sql.NullString{
|
||||||
String: "大一",
|
String: "grade one",
|
||||||
Valid: true,
|
Valid: true,
|
||||||
},
|
},
|
||||||
ClassName: "三班二年",
|
ClassName: "class three grade two",
|
||||||
Discipline: "语文",
|
Discipline: "chinese",
|
||||||
Score: 99,
|
Score: 99,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1092,12 +1092,22 @@ func TestAnonymousStructPr(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
rs := sqlmock.NewRows([]string{"name", "age", "grade", "discipline", "class_name", "score"}).AddRow("first", 2, nil, "数学", "实验班", 100).
|
rs := sqlmock.NewRows([]string{
|
||||||
AddRow("second", 3, "大一", "语文", "三班二年", 99)
|
"name",
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
"age",
|
||||||
|
"grade",
|
||||||
|
"discipline",
|
||||||
|
"class_name",
|
||||||
|
"score",
|
||||||
|
}).
|
||||||
|
AddRow("first", 2, nil, "math", "experimental class", 100).
|
||||||
|
AddRow("second", 3, "grade one", "chinese", "class three grade two", 99)
|
||||||
|
mock.ExpectQuery("select (.+) from users where user=?").
|
||||||
|
WithArgs("anyone").WillReturnRows(rs)
|
||||||
assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
|
assert.Nil(t, query(context.Background(), db, func(rows *sql.Rows) error {
|
||||||
return unmarshalRows(&value, rows, true)
|
return unmarshalRows(&value, rows, true)
|
||||||
}, "select name, age,grade,discipline,class_name,score from users where user=?", "anyone"))
|
}, "select name, age,grade,discipline,class_name,score from users where user=?",
|
||||||
|
"anyone"))
|
||||||
|
|
||||||
for i, each := range expect {
|
for i, each := range expect {
|
||||||
assert.Equal(t, each.Name, value[i].Name)
|
assert.Equal(t, each.Name, value[i].Name)
|
||||||
@ -1109,6 +1119,7 @@ func TestAnonymousStructPr(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAnonymousStructPrError(t *testing.T) {
|
func TestAnonymousStructPrError(t *testing.T) {
|
||||||
type Score struct {
|
type Score struct {
|
||||||
Discipline string `db:"discipline"`
|
Discipline string `db:"discipline"`
|
||||||
@ -1129,12 +1140,22 @@ func TestAnonymousStructPrError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
rs := sqlmock.NewRows([]string{"name", "age", "grade", "discipline", "class_name", "score"}).AddRow("first", 2, nil, "数学", "实验班", 100).
|
rs := sqlmock.NewRows([]string{
|
||||||
AddRow("second", 3, "大一", "语文", "三班二年", 99)
|
"name",
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
"age",
|
||||||
|
"grade",
|
||||||
|
"discipline",
|
||||||
|
"class_name",
|
||||||
|
"score",
|
||||||
|
}).
|
||||||
|
AddRow("first", 2, nil, "math", "experimental class", 100).
|
||||||
|
AddRow("second", 3, "grade one", "chinese", "class three grade two", 99)
|
||||||
|
mock.ExpectQuery("select (.+) from users where user=?").
|
||||||
|
WithArgs("anyone").WillReturnRows(rs)
|
||||||
assert.Error(t, query(context.Background(), db, func(rows *sql.Rows) error {
|
assert.Error(t, query(context.Background(), db, func(rows *sql.Rows) error {
|
||||||
return unmarshalRows(&value, rows, true)
|
return unmarshalRows(&value, rows, true)
|
||||||
}, "select name, age,grade,discipline,class_name,score from users where user=?", "anyone"))
|
}, "select name, age,grade,discipline,class_name,score from users where user=?",
|
||||||
|
"anyone"))
|
||||||
if len(value) > 0 {
|
if len(value) > 0 {
|
||||||
assert.Equal(t, value[0].score, 0)
|
assert.Equal(t, value[0].score, 0)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user