{"record":{"id":"acc1073f012413ff","repo":"siyuan-note/siyuan","slug":"errkeynotfound","errorCode":"ErrKeyNotFound","errorMessage":"key not found","messagePattern":"key not found","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/av/av.go","lineNumber":1343,"sourceCode":"\tif !gulu.File.IsDir(av) {\n\t\tif err := os.MkdirAll(av, 0755); err != nil {\n\t\t\tlogging.LogErrorf(\"create attribute view dir failed: %s\", err)\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetAttributeViewI18n(key string) string {\n\treturn util.AttrViewLangs[util.Lang][key].(string)\n}\n\nvar (\n\tErrAttributeViewNotFound  = errors.New(\"attribute view not found\")\n\tErrInvalidAttributeViewID = errors.New(\"invalid attribute view id\")\n\tErrInvalidBoxID           = errors.New(\"invalid box id\")\n\tErrViewNotFound           = errors.New(\"view not found\")\n\tErrKeyNotFound            = errors.New(\"key not found\")\n\tErrItemNotFound           = errors.New(\"item not found\")\n\tErrWrongLayoutType        = errors.New(\"wrong layout type\")\n\tErrInvalidColumnAlign     = errors.New(\"invalid column align\")\n\tErrSpecTooNew             = errors.New(\"attribute view spec is too new\")\n\tErrRichTextSpecMismatch   = errors.New(\"attribute view rich text requires storage spec 9\")\n\tErrFilterTooDeep          = errors.New(\"filter nesting depth exceeds the maximum allowed\")\n)\n\nconst (\n\tNodeAttrNameAvs        = \"custom-avs\"                  // 用于标记块所属的属性视图，逗号分隔 av id\n\tNodeAttrView           = \"custom-sy-av-view\"           // 用于标记块所属的属性视图视图 view id Database block support specified view https://github.com/siyuan-note/siyuan/issues/10443\n\tNodeAttrVisibleViewIDs = \"custom-sy-av-visible-views\"  // 用于标记数据库块显示的视图 ID，逗号分隔\n\tNodeAttrContextFilter  = \"custom-sy-av-context-filter\" // 用于保存数据库块独有的上下文筛选配置\n\tNodeAttrViewStaticText = \"custom-sy-av-s-text\"         // 用于标记块所属的属性视图静态文本 Database-bound block primary key supports setting static anchor text https://github.com/siyuan-note/siyuan/issues/10049\n\n\tNodeAttrViewNames = \"av-names\" // 用于临时标记块所属的属性视图名称，空格分隔\n)\n","sourceCodeStart":1325,"sourceCodeEnd":1361,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/kernel/av/av.go#L1325-L1361","documentation":"ErrKeyNotFound is returned by AttributeView.GetKey and GetKeyValues when no key (column/field) with the requested keyID exists in the parsed attribute view. Update paths (e.g. updateAttributeViewValue) use it to abort operations that would otherwise write a value into a non-existent column.","triggerScenarios":"Looking up or updating a field by keyID that is not in av.KeyValues — deleted column, wrong column ID, or keyID belonging to a different attribute view; TestUpdateAttributeViewValueRejectsMissingKey exercises exactly this.","commonSituations":"A plugin cached a key ID and the user later deleted that column; column IDs copied between two different databases; script typo or truncated key ID; sync conflict removed the column while an update was queued.","solutions":["Re-read the attribute view and resolve the key by name/type to get its current keyID before updating","Check errors.Is(err, av.ErrKeyNotFound) and skip or recreate the column as appropriate","Confirm the keyID belongs to the same avID you are operating on","Recreate the deleted column if the values are still required"],"exampleFix":"// before\nattrView.UpdateAttributeViewValue(nil, keyID, itemID, val) // ErrKeyNotFound\n// after\nif _, err := attrView.GetKey(keyID); errors.Is(err, av.ErrKeyNotFound) {\n    key := findKeyByName(attrView, \"Status\") // re-resolve current ID\n    keyID = key.ID\n}","handlingStrategy":"type-guard","validationCode":"if _, err := attrView.GetKey(keyID); err != nil {\n    return fmt.Errorf(\"key %s missing in av %s\", keyID, attrView.ID)\n}","typeGuard":"func keyExists(attrView *av.AttributeView, keyID string) bool {\n    _, err := attrView.GetKey(keyID)\n    return !errors.Is(err, av.ErrKeyNotFound)\n}","tryCatchPattern":"err := updateAttrViewValue(avID, keyID, itemID, value)\nif errors.Is(err, av.ErrKeyNotFound) {\n    keyID = resolveKeyIDByName(avID, columnName) // re-resolve, then retry once\n    err = updateAttrViewValue(avID, keyID, itemID, value)\n}","preventionTips":["Re-resolve key IDs by column name after any user-triggered schema change","Scope key IDs to one avID — never reuse IDs across databases","Wrap update calls with errors.Is checks against av.ErrKeyNotFound"],"tags":["go","attribute-view","not-found","column"],"backgroundTag":"record-not-found","analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}