Browse Source

修改bug

yjp 11 months ago
parent
commit
fa3198c13b
3 changed files with 29 additions and 12 deletions
  1. 9 0
      sql/parse_table_row.go
  2. 10 6
      sql/sql_mapping.go
  3. 10 6
      sql/sql_result.go

+ 9 - 0
sql/parse_table_row.go

@@ -93,6 +93,11 @@ func ParseSqlTableRow(input any, output any) error {
 
 	// 将输出实体赋值给输出指针变量
 	outputValue := reflect.Indirect(reflect.ValueOf(output))
+
+	if !outputValue.CanSet() {
+		return nil
+	}
+
 	if outputType.Kind() == reflect.Slice {
 		outputValue.Set(outputEntities)
 	} else {
@@ -126,6 +131,10 @@ func formOutputEntity(tableRow map[string]any, outputEntity any) error {
 			fieldValueElem := element.FieldValueElem
 			outputKind := reflectutils.GroupValueKind(fieldValueElem)
 
+			if !fieldValueElem.CanSet() {
+				continue
+			}
+
 			switch outputKind {
 			case reflect.Bool:
 				err := reflectutils.AssignBoolValue(tableRowValue, fieldValueElem)

+ 10 - 6
sql/sql_mapping.go

@@ -99,6 +99,11 @@ type MappingTypesAndValues struct {
 }
 
 func parseSqlMappingElement(field reflect.StructField, fieldValue reflect.Value) (any, error) {
+	sqlMappingTag := field.Tag.Get(sqlMappingTagKey)
+	if sqlMappingTag == sqlMappingIgnore {
+		return nil, nil
+	}
+
 	fieldValueTypeElem := field.Type
 	if field.Type.Kind() == reflect.Ptr {
 		fieldValueTypeElem = field.Type.Elem()
@@ -107,6 +112,10 @@ func parseSqlMappingElement(field reflect.StructField, fieldValue reflect.Value)
 	fieldValueElem := fieldValue
 	if fieldValue.Kind() == reflect.Ptr {
 		if !fieldValue.IsValid() || fieldValue.IsNil() {
+			if !fieldValue.CanSet() {
+				return nil, nil
+			}
+
 			fieldValue.Set(reflect.New(fieldValueTypeElem).Elem().Addr())
 		}
 
@@ -145,15 +154,10 @@ func parseSqlMappingElement(field reflect.StructField, fieldValue reflect.Value)
 		sqlColumn.CanUpdate = false
 	}
 
-	sqlMappingTag, ok := field.Tag.Lookup(sqlMappingTagKey)
-	if !ok {
+	if strutils.IsStringEmpty(sqlMappingTag) {
 		return sqlColumn, nil
 	}
 
-	if sqlMappingTag == sqlMappingIgnore {
-		return nil, nil
-	}
-
 	sqlMappingParts := strings.Split(sqlMappingTag, sqlMappingTagPartSeparator)
 	if sqlMappingParts != nil || len(sqlMappingParts) != 0 {
 		for _, sqlMappingPart := range sqlMappingParts {

+ 10 - 6
sql/sql_result.go

@@ -94,6 +94,11 @@ type ResultTypesAndValues struct {
 }
 
 func parseSqlResultElement(field reflect.StructField, fieldValue reflect.Value) (any, error) {
+	sqlResultTag := field.Tag.Get(sqlResultTagKey)
+	if sqlResultTag == sqlResultIgnore {
+		return nil, nil
+	}
+
 	fieldValueTypeElem := field.Type
 	if field.Type.Kind() == reflect.Ptr {
 		fieldValueTypeElem = field.Type.Elem()
@@ -102,6 +107,10 @@ func parseSqlResultElement(field reflect.StructField, fieldValue reflect.Value)
 	fieldValueElem := fieldValue
 	if fieldValue.Kind() == reflect.Ptr {
 		if !fieldValue.IsValid() || fieldValue.IsNil() {
+			if !fieldValue.CanSet() {
+				return nil, nil
+			}
+
 			fieldValue.Set(reflect.New(fieldValueTypeElem).Elem().Addr())
 		}
 
@@ -133,15 +142,10 @@ func parseSqlResultElement(field reflect.StructField, fieldValue reflect.Value)
 		},
 	}
 
-	sqlResultTag, ok := field.Tag.Lookup(sqlResultTagKey)
-	if !ok {
+	if strutils.IsStringEmpty(sqlResultTag) {
 		return sqlColumn, nil
 	}
 
-	if sqlResultTag == sqlResultIgnore {
-		return nil, nil
-	}
-
 	sqlResultParts := strings.Split(sqlResultTag, sqlResultTagPartSeparator)
 	if sqlResultParts != nil || len(sqlResultParts) != 0 {
 		for _, sqlResultPart := range sqlResultParts {