如何使用pg-format批量插入含数组列的PostgreSQL多行数据?
解决pg-format批量插入含TEXT[]列的问题
方法1:逐行格式化字段
pg-format的%L会扁平化嵌套数组,导致列数不匹配。可以对每行的三个字段分别用%L格式化,再拼接成行:
const arr = [[uuid1, uuid2, ['str','str']], [uuid3, uuid4, ['str','str']]]; // 为每行生成独立的格式化模板 const rowTemplates = arr.map(row => format('(%L, %L, %L)', ...row)); const query = format(`INSERT INTO test (a,b,c) VALUES %s`, rowTemplates.join(', '));
这样每个字段(包括TEXT[]类型的c列)都会被正确转义为PostgreSQL可识别的格式,不会被拆分。
方法2:使用参数化查询(推荐)
直接利用pg库的参数化查询能力,既避免SQL注入,又能自动处理数组类型:
const { Client } = require('pg'); const client = new Client(/* 你的数据库连接配置 */); const arr = [[uuid1, uuid2, ['str','str']], [uuid3, uuid4, ['str','str']]]; // 生成占位符序列,如 ($1,$2,$3), ($4,$5,$6)... const placeholders = arr.map((_, idx) => { const base = idx * 3 + 1; return `($${base}, $${base+1}, $${base+2})`; }).join(', '); // 扁平化参数数组,供pg库自动处理 const params = arr.flat(); const query = `INSERT INTO test (a,b,c) VALUES ${placeholders}`; client.query(query, params);
pg库会自动将JavaScript数组转换为PostgreSQL的TEXT[]类型,无需手动处理格式。
方法3:手动构造PostgreSQL数组字符串
如果坚持用pg-format,可以先将JavaScript数组转换为PostgreSQL的数组语法字符串(如'{"str1","str2"}'),再传入格式化函数:
const arr = [[uuid1, uuid2, ['str','str']], [uuid3, uuid4, ['str','str']]]; // 转换数组为PostgreSQL兼容格式,注意转义双引号 const formattedRows = arr.map(row => [ row[0], row[1], `{${row[2].map(str => `"${str.replace(/"/g, '\\"')}"`).join(',')}}` ]); const query = format(`INSERT INTO test (a,b,c) VALUES %L`, formattedRows);
这种方法需要自行处理字符串转义,存在一定注入风险,仅在特殊场景下使用。
内容的提问来源于stack exchange,提问作者Ari Baranian
相关产品推荐
相关产品推荐

