You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:50:32