{"record":{"id":"a3970f19c3dfed65","repo":"siyuan-note/siyuan","slug":"av-and-key-are-required","errorCode":null,"errorMessage":"--av and --key are required","messagePattern":"--av and --key are required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/cli/cmd/database.go","lineNumber":174,"sourceCode":"\t\tkeyID := ast.NewNodeID()\n\t\tif err := model.AddAttributeViewKey(avID, \"\", keyID, name, keyType, icon, prev, av.DateDisplayFormatFull); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmodel.AppendPushReloadAttrViewEntry(avID)\n\t\tfmt.Println(keyID)\n\t\treturn nil\n\t},\n}\n\nvar databaseKeyRemoveCmd = &cobra.Command{\n\tUse:   \"remove --av <avID> --key <keyID>\",\n\tShort: \"Remove a key (field) from database\",\n\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\tavID, _ := cmd.Flags().GetString(\"av\")\n\t\tkeyID, _ := cmd.Flags().GetString(\"key\")\n\t\tremoveRelation, _ := cmd.Flags().GetBool(\"remove-relation-dest\")\n\t\tif avID == \"\" || keyID == \"\" {\n\t\t\treturn fmt.Errorf(\"--av and --key are required\")\n\t\t}\n\n\t\tif dryRun {\n\t\t\tfmt.Printf(\"[dry-run] Would remove key %s from database %s\\n\", keyID, avID)\n\t\t\treturn nil\n\t\t}\n\n\t\tif err := model.RemoveAttributeViewKey(avID, keyID, removeRelation); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmodel.AppendPushReloadAttrViewEntry(avID)\n\t\tfmt.Println(\"ok\")\n\t\treturn nil\n\t},\n}\n\nvar databaseUnusedCmd = &cobra.Command{\n\tUse:   \"unused\",","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/cli/cmd/database.go#L156-L192","documentation":"The `database remove-key` subcommand requires both `--av` (database ID) and `--key` (key/field ID). Either being empty returns this combined error before any removal. This guard prevents accidental unscoped deletions.","triggerScenarios":"Running `siyuan database remove-key` without `--key`, without `--av`, or with both empty. Note `--key` must be the key ID, not the display name.","commonSituations":"Passing a human-readable field name to `--key` instead of its ID; forgetting `--av` when the key ID alone seems unique; automation scripts with unset variables.","solutions":["Fetch the key ID via `siyuan database keys --av <avID>` and pass it to `--key`","Provide both flags: `--av <avID> --key <keyID>`","Optionally set `--remove-relation-dest` to also clean relation destinations","Use `--dry-run` before actual removal"],"exampleFix":"// before\nsiyuan database remove-key --av 20240101120000-avxyz --key \"Priority\"\n// after\nsiyuan database remove-key --av 20240101120000-avxyz --key 20240101120000-key1","handlingStrategy":"validation","validationCode":"if [ -z \"$AV_ID\" ] || [ -z \"$KEY_ID\" ]; then\n  echo \"--av and --key are required\"; exit 1\nfi\nKEY_ID=$(siyuan database keys --av \"$AV_ID\" | resolve-id-of \"$KEY_NAME\")\nsiyuan database remove-key --av \"$AV_ID\" --key \"$KEY_ID\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Resolve key IDs via `database keys` instead of guessing from names","Validate both flags for non-emptiness","Use --dry-run before destructive removal","Consider --remove-relation-dest implications beforehand"],"tags":["cli","validation","database"],"backgroundTag":"missing-required-flag","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}