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

Java Runtime.exec执行psql命令失败,请求排查问题原因

问题原因及解决办法

核心原因

你的命令存在两个关键问题:

  1. 引号语法错误:原命令字符串末尾的'\"多了一个单引号,导致COPY命令的引号无法正确闭合,psql收到的是不完整的"COPY开头,直接触发未终止引号的报错。
  2. Runtime.exec的参数解析逻辑:直接传递完整命令字符串时,Java不会像Shell那样识别引号内的空格,它会按空格拆分所有参数,导致-c后面的COPY命令被拆成多个无效片段,进一步加剧语法错误。

修复方案

方案1:修正字符串转义(不推荐,仍存在参数拆分风险)

去掉末尾多余的单引号,保证双引号正确闭合:

this.psqlExportDataFile = "psql postgresql://dburl -o /Users/Shared/CopyDB/project.csv -c \"COPY (SELECT * FROM gls.project where id in (112371,148904,1652068)) TO STDOUT(FORMAT csv, DELIMITER ',', NULL 'null')\"";

方案2:使用字符串数组传递参数(推荐,彻底规避拆分问题)

Runtime.exec的字符串数组参数可以精准传递每个命令片段,无需处理复杂的引号转义:

String[] cmd = {
    "psql",
    "postgresql://dburl",
    "-o", "/Users/Shared/CopyDB/project.csv",
    "-c", "COPY (SELECT * FROM gls.project where id in (112371,148904,1652068)) TO STDOUT(FORMAT csv, DELIMITER ',', NULL 'null')"
};
Process process = runtime.exec(cmd);

这种方式下,-c后面的完整COPY命令会作为单个参数传递给psql,不会被错误拆分。

内容的提问来源于stack exchange,提问作者Arsen Alexanyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:50:04