使用map函数向Redshift参数化查询传递数组值的问题求助
报错原因
你遇到的报错由两个问题共同导致:
- 参数结构错误:你将
event.map返回的二维数组外层额外套了一层数组,最终传入parameterizedQuery的参数是1个三维数组,而非语句要求的6个独立参数 - INSERT语句不匹配:你写的单条
INSERT语句的VALUES子句只支持插入1行数据,无法直接匹配对象数组对应的多行插入需求
可用实现方案
方案1:批量构造多行INSERT语句(中小数据量首选)
通过动态生成多行VALUES占位符,将所有参数扁平化为一维数组后执行,单次请求完成全部插入,性能远高于逐行插入。
try { const params = []; const valuePlaceholders = []; event.forEach((item, index) => { // 生成当前行对应的参数占位符 const rowPlaceholders = Array.from({length: 6}, (_, i) => `$${index * 6 + i + 1}`); valuePlaceholders.push(`(${rowPlaceholders.join(',')})`); // 按顺序推入当前行的所有参数值 params.push(id, item.test1, item.test2, item.test3, item.test4, test5); }); // 拼接完整插入SQL const insertSql = `INSERT INTO tablename (id, test1, test2, test3, test4, test5) VALUES ${valuePlaceholders.join(',')}`; responseBody = redshiftClient.parameterizedQuery(insertSql, params); } catch (err) { console.log(err); } const response = { "statusCode": 200, "headers": {}, "body": JSON.stringify(responseBody), "isBase64Encoded": false }; console.log('Response', response); return response;
方案2:逐行插入(适合小数据量、需单独判断每行插入结果的场景)
遍历数组每行单独执行插入语句,异步场景下可通过Promise.all等待所有插入完成。
try { // 生成所有插入任务的Promise数组 const insertTasks = event.map(item => { return redshiftClient.parameterizedQuery( 'INSERT INTO tablename (id, test1, test2, test3, test4, test5) VALUES ($1,$2,$3,$4,$5,$6)', [id, item.test1, item.test2, item.test3, item.test4, test5] ); }); // 等待所有插入执行完成,注意如果redshiftClient方法是异步的,需要加await responseBody = await Promise.all(insertTasks); } catch (err) { console.log(err); } // 后续返回response逻辑和方案1一致
方案3:COPY命令导入(大数据量首选)
如果插入的数组规模超过1000行,推荐先将数组序列化为JSON/CSV格式上传到S3,再调用Redshift的COPY命令直接从S3导入数据,插入性能远高于直接执行INSERT语句。
内容的提问来源于stack exchange,提问作者Sanjay Prakash
相关产品推荐
相关产品推荐

