Node.js用pg pool插入PostgreSQL蜡烛数据异步顺序错乱问题咨询
问题根源
你当前的实现中,map遍历会同时触发所有异步插入请求,多个请求并发提交到数据库时,数据库处理完成的顺序不固定,最终导致插入顺序错乱。同时直接拼接SQL字符串的写法存在严重的SQL注入风险,建议使用参数化查询避免该问题。
方案1:按原顺序串行插入
如果需要严格保证插入顺序和API返回顺序一致,可以使用for...of循环串行执行插入操作,前一条插入完成后才会执行下一条:
// 串行插入实现 for (const element of response.candles) { await pool.query( `INSERT INTO nifty_50 (date, open, high, low, close) VALUES ($1, $2, $3, $4, $5)`, [element[0], element[1], element[2], element[3], element[4]] ); }
该方案实现简单,但数据量较大时插入耗时较长
方案2:批量插入(推荐)
批量插入性能更高,且能保证插入顺序和原数组顺序一致,只需要拼接一次SQL语句,单次请求提交所有插入数据:
// 批量插入实现 if (response.candles.length === 0) return; // 生成占位符,每5个参数对应一条记录:($1,$2,$3,$4,$5),($6,$7,$8,$9,$10)... const placeholders = response.candles.map((_, index) => `($${index * 5 + 1}, $${index * 5 + 2}, $${index * 5 + 3}, $${index * 5 + 4}, $${index * 5 + 5})`).join(','); // 把二维数组压平成一维参数数组 const values = response.candles.flatMap(item => [item[0], item[1], item[2], item[3], item[4]]); // 执行批量插入 await pool.query( `INSERT INTO nifty_50 (date, open, high, low, close) VALUES ${placeholders}`, values );
该方案仅需一次数据库请求,性能远高于串行插入,适合任意数据量场景
内容的提问来源于stack exchange,提问作者Himanshu Pandey
相关产品推荐
相关产品推荐

