浏览代码

MapToSlice: return error instead of panic

xormplus 9 年之前
父节点
当前提交
483f98cee7
共有 1 个文件被更改,包括 11 次插入3 次删除
  1. 11 3
      db.go

+ 11 - 3
db.go

@@ -4,6 +4,7 @@ import (
 	"database/sql"
 	"database/sql/driver"
 	"errors"
+	"fmt"
 	"reflect"
 	"regexp"
 	"sync"
@@ -15,12 +16,19 @@ func MapToSlice(query string, mp interface{}) (string, []interface{}, error) {
 		return "", []interface{}{}, ErrNoMapPointer
 	}
 
-	args := make([]interface{}, 0)
+	args := make([]interface{}, 0, len(vv.Elem().MapKeys()))
+	var err error
 	query = re.ReplaceAllStringFunc(query, func(src string) string {
-		args = append(args, vv.Elem().MapIndex(reflect.ValueOf(src[1:])).Interface())
+		v := vv.Elem().MapIndex(reflect.ValueOf(src[1:]))
+		if !v.IsValid() {
+			err = fmt.Errorf("map key %s is missing", src[1:])
+		} else {
+			args = append(args, v.Interface())
+		}
 		return "?"
 	})
-	return query, args, nil
+
+	return query, args, err
 }
 
 func StructToSlice(query string, st interface{}) (string, []interface{}, error) {