diff --git a/db.go b/db.go index e518f14f..1e0ae170 100644 --- a/db.go +++ b/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) {