问题
导入向导在适配器/客户端不支持服务端 /import 路由时,会静默降级为逐行裸 POST /api/v1/data/:object(注释原话:"Older adapter/client without /import — silently fall back")。这条降级路径不做引用解析、不做类型强转,造成静默数据损坏:
- lookup 列的原始自然键字符串被直接写进 FK 列(如
parent = 'QA-2806-New-Parent',而非目标记录 id)——连引用已存在记录的行都不解析;
- 空引用写成
'' 而非 null;
- 全部行报「导入成功」,损坏在网格中仅表现为引用列显示"—",无任何告警。
位置:packages/plugin-grid/src/ImportWizard.tsx(silently fall back 分支,~L1885/L1942)
真机复现(2026-07-17)
framework showcase(objectstack dev --ui,全新 SQLite)+ 走降级路径的 console 构建,对 showcase_category(parent 为指向本对象的 lookup)导入:
name,parent
Control-Child,Existing-Parent ← Existing-Parent 已在库中
New-Parent,
New-Child,New-Parent
网络面板:3 × POST /api/v1/data/showcase_category(未发任何 /import 请求);结果「已导入 3 条」全成功;数据库实查:Control-Child.parent = 'Existing-Parent'(字符串)、New-Parent.parent = ''、New-Child.parent = 'New-Parent'(字符串)。对照:同服务器上走 /import 的当前版向导,引用解析正常。
建议修法
- 降级不得静默:进入 fallback 时向用户显式告警(降级原因 + 能力差异)。
- 映射中含 lookup / master_detail / user 列时,fallback 应拒绝导入(提示升级服务端/适配器),而非把自然键原样写入 FK。
- (可选)fallback 至少复用客户端已有的类型强转,空串引用应写 null。
验收标准
/import 不可达 + 含 lookup 列 → 导入被阻止并给出明确提示,不产生字符串 FK。
/import 不可达 + 纯标量列 → 可降级,但界面明示已降级。
- 组件测试覆盖上述两分支。
—— 发现于 framework#2678 批量写入路径专项测试的真机 UI 环节(测试报告见该 issue 评论)。
问题
导入向导在适配器/客户端不支持服务端
/import路由时,会静默降级为逐行裸POST /api/v1/data/:object(注释原话:"Older adapter/client without /import — silently fall back")。这条降级路径不做引用解析、不做类型强转,造成静默数据损坏:parent = 'QA-2806-New-Parent',而非目标记录 id)——连引用已存在记录的行都不解析;''而非 null;位置:packages/plugin-grid/src/ImportWizard.tsx(silently fall back 分支,~L1885/L1942)
真机复现(2026-07-17)
framework showcase(
objectstack dev --ui,全新 SQLite)+ 走降级路径的 console 构建,对showcase_category(parent为指向本对象的 lookup)导入:网络面板:3 ×
POST /api/v1/data/showcase_category(未发任何/import请求);结果「已导入 3 条」全成功;数据库实查:Control-Child.parent = 'Existing-Parent'(字符串)、New-Parent.parent = ''、New-Child.parent = 'New-Parent'(字符串)。对照:同服务器上走/import的当前版向导,引用解析正常。建议修法
验收标准
/import不可达 + 含 lookup 列 → 导入被阻止并给出明确提示,不产生字符串 FK。/import不可达 + 纯标量列 → 可降级,但界面明示已降级。—— 发现于 framework#2678 批量写入路径专项测试的真机 UI 环节(测试报告见该 issue 评论)。