yjp hace 11 meses
padre
commit
fa38f0be43
Se han modificado 2 ficheros con 9 adiciones y 13 borrados
  1. 6 6
      sql/sql.go
  2. 3 7
      sql/sql_mapping.go

+ 6 - 6
sql/sql.go

@@ -71,7 +71,7 @@ func formInsertTableRow(e any, tableRows *sql_tpl.TableRows) error {
 	for fieldName, mappingElement := range sqlMapping.MappingElement {
 		switch element := mappingElement.(type) {
 		case *MappingStruct:
-			err := formInsertTableRow(element.FieldValueElem.Addr().Interface(), tableRows)
+			err := formInsertTableRow(element.FieldValueElem.Interface(), tableRows)
 			if err != nil {
 				return err
 			}
@@ -85,7 +85,7 @@ func formInsertTableRow(e any, tableRows *sql_tpl.TableRows) error {
 			// 有值取值,没有值构造零值
 			value := reflect.Zero(fieldType).Interface()
 			if fieldType.Kind() != reflect.Slice {
-				if !element.FieldValueElem.IsZero() {
+				if element.FieldValueElem.IsValid() && !element.FieldValueElem.IsZero() {
 					value = element.FieldValueElem.Interface()
 				}
 
@@ -171,7 +171,7 @@ func formDeleteConditions(e any, conditions *sql_tpl.Conditions) error {
 	for _, mappingElement := range sqlMapping.MappingElement {
 		switch element := mappingElement.(type) {
 		case *MappingStruct:
-			err := formDeleteConditions(element.FieldValueElem.Addr().Interface(), conditions)
+			err := formDeleteConditions(element.FieldValueElem.Interface(), conditions)
 			if err != nil {
 				return err
 			}
@@ -182,7 +182,7 @@ func formDeleteConditions(e any, conditions *sql_tpl.Conditions) error {
 			}
 
 			// 键字段没有赋值
-			if element.FieldValueElem.IsZero() {
+			if !element.FieldValueElem.IsValid() || element.FieldValueElem.IsZero() {
 				return errors.New("键字段没有传值")
 			}
 
@@ -249,7 +249,7 @@ func formUpdateTableRowsAndConditions(e any, tableRows *sql_tpl.TableRows, condi
 	for fieldName, mappingElement := range sqlMapping.MappingElement {
 		switch element := mappingElement.(type) {
 		case *MappingStruct:
-			err := formUpdateTableRowsAndConditions(element.FieldValueElem.Addr().Interface(), tableRows, conditions)
+			err := formUpdateTableRowsAndConditions(element.FieldValueElem.Interface(), tableRows, conditions)
 			if err != nil {
 				return err
 			}
@@ -273,7 +273,7 @@ func formUpdateTableRowsAndConditions(e any, tableRows *sql_tpl.TableRows, condi
 
 			value := reflect.Zero(fieldType).Interface()
 			if fieldType.Kind() != reflect.Slice {
-				if !element.FieldValueElem.IsZero() {
+				if element.FieldValueElem.IsValid() && !element.FieldValueElem.IsZero() {
 					value = element.FieldValueElem.Interface()
 				}
 

+ 3 - 7
sql/sql_mapping.go

@@ -112,14 +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())
+			fieldValueElem = reflect.New(fieldValueTypeElem).Elem()
+		} else {
+			fieldValueElem = fieldValue.Elem()
 		}
-
-		fieldValueElem = fieldValue.Elem()
 	}
 
 	if fieldValueTypeElem.Kind() == reflect.Struct && fieldValueTypeElem != reflect.TypeOf(time.Time{}) {