使用QLDB Node.js驱动批量更新字段时遭遇语法解析错误
QLDB Node.js驱动更新文档报错:Invalid path component
问题描述
尝试实现处理PATCH/PUT请求的API端点,用请求负载更新QLDB文档,代码如下:
await driver.executeLambda(async (txn) => { await txn.execute( `UPDATE People AS p BY p_id SET ? WHERE p_id = ?`, requestPayload, documentId, ); });
执行后报错:
BadRequestException: Parser Error: at line 1, column 32: Invalid path component, expecting either an IDENTIFIER or STAR, got: QUESTION_MARK with value: 1; Expected identifier for simple path
已确认在QLDB控制台执行UPDATE People AS p BY p_id SET p.name = 'John Doe' WHERE p_id = '<document_id>'可正常生效,且requestPayload是对象、documentId是字符串,变量值符合预期。
想问QLDB Node.js驱动是否不支持这种更新方式?
解决方案
QLDB的参数化查询不支持直接用占位符?代替整个SET子句的内容,占位符只能用来替换单个值,不能替换字段赋值的整个块。你需要手动构建SET子句,把requestPayload中的键值对转换成QLDB支持的赋值格式。
具体实现代码
await driver.executeLambda(async (txn) => { // 构建SET子句片段和对应参数数组 const setClauses = []; const params = []; // 遍历请求负载的键值对,生成字段赋值语句 for (const [key, value] of Object.entries(requestPayload)) { setClauses.push(`p.${key} = ?`); params.push(value); } // 添加文档ID到参数末尾 params.push(documentId); // 拼接完整的UPDATE语句 const updateQuery = `UPDATE People AS p BY p_id SET ${setClauses.join(', ')} WHERE p_id = ?`; // 执行查询 await txn.execute(updateQuery, ...params); });
说明
- 控制台语句能生效是因为直接写死了明确的字段赋值逻辑,而QLDB的查询解析器无法识别占位符代替的整个SET块,必须明确指定要更新的字段和对应值的占位符。
- 上述代码会根据
requestPayload动态生成合法的SET子句,比如requestPayload为{name: 'John Doe', age: 30}时,生成的查询语句为UPDATE People AS p BY p_id SET p.name = ?, p.age = ? WHERE p_id = ?,参数数组为['John Doe', 30, '<document_id>'],完全符合QLDB参数化查询的要求。
内容的提问来源于stack exchange,提问作者mightimaus
相关产品推荐
相关产品推荐

