NocoBase `nb api resource destroy` 命令详解:从主键到条件过滤的精准删除
2026/9/13 23:34:32 网站建设 项目流程

NocoBasenb api resource destroy命令详解:从主键到条件过滤的精准删除

【免费下载链接】nocobaseNocoBase is an open-source AI + no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase

nb api resource destroy是 NocoBase CLI 中用于删除任意资源(数据表)记录的通用删除命令。它既支持通过主键值(--filter-by-tk)精确删除单条记录,也支持通过 JSON 过滤条件(--filter)批量删除符合条件的记录,并且天然兼容关联资源(如posts.comments)和多数据源场景。读完本文,你将掌握该命令的全部参数语义、两种定位方式的取舍、关联资源删除的用法,以及它底层的 HTTP 请求实现原理。

命令概览与适用场景

在 NocoBase 的 nb api resource 命令家族中,destroy承担的是 CRUD 中的Delete语义。它面向任何注册到 NocoBase 的资源,包括:

  • 普通资源,例如usersorders
  • 关联资源,例如posts.comments(需配合--source-id指定源记录);
  • main数据源中的资源(通过--data-source切换)。

它适用于运维脚本、数据清理、测试数据准备以及 AI Agent 自动化操作等场景,无需编写额外代码即可直接对 API 层发起删除请求。

用法与参数说明

基本用法

nb api resource destroy --resource <resource> [flags]

--resource为必填项,其余参数均可选。命令定义的源码位于 commands/api/resource/destroy.ts,其中 flags 全部来自 lib/resource-command.ts 中导出的destroyFlags

定位记录的参数

参数类型说明
--resourcestring资源名称,必填,例如usersordersposts.comments
--data-sourcestring数据源 key,默认main
--source-idstring关联资源的源记录 ID(如删除posts.comments时指定所属posts记录的 ID)
--filter-by-tkstring主键值(primary key)。复合主键或多个 key 时可以传 JSON 数组
--filterstringJSON 对象形式的过滤条件,用于按字段值批量定位记录

其中--resource--data-source--source-id属于所有 resource 子命令共享的基础参数(resourceBaseFlags/resourceAssociationFlags),而--filter-by-tk--filter是 destroy 专属的定位参数。

两种定位方式的取舍

  • --filter-by-tk:按主键精准删除。适用于删除单条明确记录,语义与get--filter-by-tk一致。当目标表是复合主键时,可传 JSON 数组,例如--filter-by-tk '[1001,2026]'
  • --filter:按条件批量删除。适用于"删除所有符合某条件的记录",例如删除所有statusarchived的帖子。该值必须是合法的 JSON 对象,且不能是数组或标量。

在 lib/resource-command.ts 的buildDestroyArgs(L383-L393)中可以看到两者的解析逻辑:

  • --filter-by-tkparseFlexibleValue:当值以[{nulltruefalse开头时按 JSON 解析,否则按普通字符串/数字处理,因此既支持1这样的标量,也支持[1001,2026]这样的 JSON 数组;
  • --filterparseObjectFlag:必须解析为 JSON 对象,否则直接报错--filter must be a JSON object

两个参数都未指定时,命令仍会发出请求(等价于无定位条件的删除动作),实际删除范围取决于服务端资源定义,因此建议显式传入至少一种定位方式。

通用连接参数

destroy同时支持 nb api resource 的全部通用参数:

参数说明
--api-base-urlNocoBase API 地址,例如http://localhost:13000/api
--verbose显示详细进度输出
--env,-e环境名称
--yes,-y当显式--env指向的 env 与当前 env 不一致时,跳过交互确认
--role角色覆盖,作为X-Role请求头发送
--token,-tAPI key 覆盖
--json-output,-j/--no-json-output是否输出原始 JSON,默认开启

需要特别留意--env的行为:只有在显式传入--env时,CLI 才会检查其与当前 env 是否一致。如果显式指定了不同的 env,交互终端会先确认;在非交互终端或 AI Agent 场景下,需要自行显式追加--yes,或先执行nb env use <name>再重试。该逻辑实现在runResourceCommand中的ensureCrossEnvConfirmed(lib/resource-command.ts)。

完整示例

# 按主键删除 users 资源中 id 为 1 的记录 nb api resource destroy --resource users --filter-by-tk 1 # 按条件删除 posts 资源中所有 status 为 archived 的记录 nb api resource destroy --resource posts --filter '{"status":"archived"}' # 删除关联资源:posts 下 id 为 1 的评论中主键为 5 的记录 nb api resource destroy --resource posts.comments --source-id 1 --filter-by-tk 5 # 复合主键:以 JSON 数组形式传入多个 key nb api resource destroy --resource order_items --filter-by-tk '[1001,2026]' # 指定非 main 数据源并跳过跨环境确认(非交互场景) nb api resource destroy --resource legacy_orders --data-source legacy --filter '{"state":"draft"}' --env prod --yes

命令执行成功后,默认以美化后的 JSON 打印服务端响应(即--json-output默认开启);使用--no-json-output时则只输出HTTP <status>状态行。若请求失败(ok为 false),CLI 会直接报错并携带状态码与响应体,便于定位问题(见 lib/resource-command.ts 的printResponse实现)。

底层实现:命令如何转化为 HTTP 请求

从源码结构看,destroy的完整调用链为:

  1. commands/api/resource/destroy.ts 解析 flags 并调用runResourceCommand
  2. runResourceCommand先做跨环境确认,再通过executeResourceRequest发起请求;
  3. lib/resource-request.ts 的executeResourceRequest将参数组装为一次POST请求(method: 'POST'),请求路径形如/<resource>:destroy(关联资源则拼接--source-id对应的源记录段)。

几个关键实现细节:

  • 请求方法统一为 POST:与 NocoBase resourcer 的约定一致,destroy动作通过POST /api/<resource>:destroy触发(参见 lib/resource-request.ts);
  • --filter-by-tk走查询串、--filter走请求体:定位参数在buildActionQuery/buildActionPayload中分别被组装到 query 和 body,符合 NocoBase API 对filterByTkfilter参数的区分;
  • 多数据源通过请求头切换:当--data-source指定且不等于main时,请求会携带x-data-source头(lib/resource-request.ts),从而删除非默认数据源中的记录;
  • 角色与鉴权--role--token分别对应X-Role请求头与 API key 覆盖,用于在删除时模拟特定角色或使用独立凭证。

这意味着nb api resource destroy本质上是对 NocoBase 标准 HTTP API 的一层 CLI 封装:理解它的参数,也就理解了对应 API 端点的调用方式,方便在脚本或自定义客户端中复现同样的删除操作。

注意事项与最佳实践

  • 批量删除前先确认范围--filter会删除所有匹配记录,属于不可逆操作。建议先用nb api resource list --resource <resource> --filter '<同一条件>'(见 list)预览命中记录,再执行删除。
  • 复合主键必须用 JSON 数组:当目标表存在复合主键时,--filter-by-tk应传入 JSON 数组形式,例如'[1001,2026]';普通主键直接传标量即可。
  • 关联资源必须配合--source-id:删除posts.comments这类关联资源时,缺少--source-id将无法正确定位到源记录下的目标集合。
  • 非交互环境记得--yes:CI 或 AI Agent 中若通过--env切换了环境,务必显式追加--yes跳过确认,否则命令会中止。
  • 利用--verbose排查:请求异常时加--verbose可输出详细进度,结合失败响应中的状态码与 body 快速定位问题。

相关命令

  • nb api resource list—— 列出资源记录,删除前预览数据范围
  • nb api resource get—— 获取单条资源记录
  • nb api resource create—— 创建资源记录
  • nb api resource update—— 更新资源记录
  • nb api resource query—— 执行聚合查询
  • nb api resource—— 命令总览与通用连接参数

【免费下载链接】nocobaseNocoBase is an open-source AI + no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询