{"record":{"id":"21a5542ddeb466c6","repo":"jmoiron/sqlx","slug":"could-not-find-name-s-in-v","errorCode":null,"errorMessage":"could not find name %s in %#v","messagePattern":"could not find name (.+?) in %#v","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"named.go","lineNumber":184,"sourceCode":"\t}\n\treturn bindArgs(names, arg, m)\n}\n\n// private interface to generate a list of interfaces from a given struct\n// type, given a list of names to pull out of the struct.  Used by public\n// BindStruct interface.\nfunc bindArgs(names []string, arg interface{}, m *reflectx.Mapper) ([]interface{}, error) {\n\targlist := make([]interface{}, 0, len(names))\n\n\t// grab the indirected value of arg\n\tvar v reflect.Value\n\tfor v = reflect.ValueOf(arg); v.Kind() == reflect.Ptr; {\n\t\tv = v.Elem()\n\t}\n\n\terr := m.TraversalsByNameFunc(v.Type(), names, func(i int, t []int) error {\n\t\tif len(t) == 0 {\n\t\t\treturn fmt.Errorf(\"could not find name %s in %#v\", names[i], arg)\n\t\t}\n\n\t\tval := reflectx.FieldByIndexesReadOnly(v, t)\n\t\targlist = append(arglist, val.Interface())\n\n\t\treturn nil\n\t})\n\n\treturn arglist, err\n}\n\n// like bindArgs, but for maps.\nfunc bindMapArgs(names []string, arg map[string]interface{}) ([]interface{}, error) {\n\targlist := make([]interface{}, 0, len(names))\n\n\tfor _, name := range names {\n\t\tval, ok := arg[name]\n\t\tif !ok {","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/jmoiron/sqlx/blob/41dac167fdad5e3fd81d66cafba0951dc6823a30/named.go#L166-L202","documentation":"When binding a struct argument for a named query, sqlx resolves each named parameter to a struct field via TraversalsByNameFunc. If a name resolves to an empty traversal (no matching field), it cannot supply the argument and reports which name was missing and the whole argument value. This is the struct-binding counterpart of the map-binding 'missing name' error.","triggerScenarios":"Query.Named/Exec/Get/Select with :name or ?name parameters that do not correspond to any exported field/db-tag on the passed struct.","commonSituations":"Typo in a named parameter vs struct field; missing `db` tag; using nested field names like user.id unsupported by default mapper; parameter named after a field that was removed/renamed.","solutions":["Add or fix the struct field so every named parameter matches an exported field (or its `db` tag).","Correct the query's parameter names to match struct fields.","For nested values, flatten them into top-level fields or register a custom mapper.","Bind via a map[string]interface{} instead of a struct when values are not field-shaped."],"exampleFix":"// before\nq := \"INSERT INTO t (a, b) VALUES (:a, :b)\"\ntype row struct{ A string `db:\"a\"` } // b missing\n// after\ntype row struct {\n    A string `db:\"a\"`\n    B string `db:\"b\"`\n}","handlingStrategy":"validation","validationCode":"func structCoversNames(arg interface{}, names []string) error {\n\tv := reflect.Indirect(reflect.ValueOf(arg))\n\tt := v.Type()\n\tfor _, n := range names {\n\t\tif _, ok := t.FieldByNameFunc(func(f reflect.StructField) bool {\n\t\t\ttag := f.Tag.Get(\"db\")\n\t\t\treturn f.Name == n || tag == n || strings.EqualFold(f.Name, n)\n\t\t}); !ok {\n\t\t\treturn fmt.Errorf(\"query param %q not on struct %s\", n, t.Name())\n\t\t}\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":"q, args, err := db.BindNamed(query, structArg)\nif err != nil && strings.Contains(err.Error(), \"could not find name\") {\n\t// log err (it names the missing field) and fix struct/query\n\treturn err\n}","preventionTips":["Keep named parameters and struct db tags in sync.","Export all fields used for binding.","Avoid nested/dotted parameter names with the default mapper.","Add a unit test that BindNames every query against its arg type."],"tags":["sql","named-parameters","reflection","bind"],"backgroundTag":"named-parameter-not-found","analyzedSha":"41dac167fdad5e3fd81d66cafba0951dc6823a30","analyzedAt":"2026-09-03T06:10:20.382Z","contentChangedAt":"2026-09-03T06:10:20.382Z","schemaVersion":2},"datasetVersion":"2026-09-10T12:17:11.382Z"}