PostgreSQL从CSV插入JSON数组时出现数组字面量格式错误问题
问题
尝试通过CSV向PostgreSQL表中插入JSON数组(表结构里该字段定义为json类型),用的INSERT语句是这样的:
INSERT INTO "MySchema".my_table (id, main_array) values(DEFAULT, '{{"KeyA": 10,"KeyB":20},{"KeyA": 100,"KeyB":200}}');
执行后直接报错:
ERROR: malformed array literal Detail: Unexpected array element.
注:这个INSERT语句是数据库自己生成的,但用Node.js的Sequelize代码处理同一个JSON数组时能正常运行。CSV文件结构如下:
mytable.csv
1,{{"KeyA": 10,"KeyB":20},{"KeyA": 100,"KeyB":200}}
解决方案
问题出在格式识别:你写的双层大括号
{{...}}会被PostgreSQL当成PostgreSQL原生数组的字面量,但你的字段类型是json,格式不匹配才报错。Sequelize能正常跑是因为它会自动把JSON数组转成PostgreSQL认的正确格式。改INSERT语句:把双层大括号换成单层大括号,要是PostgreSQL还是识别不了,就显式指定类型转换:
-- 常规写法:直接用标准JSON数组格式 INSERT INTO "MySchema".my_table (id, main_array) VALUES(DEFAULT, '[{"KeyA": 10,"KeyB":20},{"KeyA": 100,"KeyB":200}]'); -- 显式转类型(可选,用于自动识别失效的情况) INSERT INTO "MySchema".my_table (id, main_array) VALUES(DEFAULT, '[{"KeyA": 10,"KeyB":20},{"KeyA": 100,"KeyB":200}]'::json);
- 修正CSV文件:把CSV里的双层大括号改成单层大括号,保证内容是标准JSON数组:
修正后的mytable.csv
1,[{"KeyA": 10,"KeyB":20},{"KeyA": 100,"KeyB":200}]
- 额外提醒:如果是用
COPY命令导CSV,得确保CSV里的JSON数组是标准格式,要是碰到特殊字符转义问题,可以配合FORMAT csv设置合适的转义符,或者提前处理好CSV内容。
内容的提问来源于stack exchange,提问作者sofa_maniac
相关产品推荐
相关产品推荐

