使用 Java exec 的额外 psql 命令行参数

Extra psql command-line arguments using Java exec

我正在使用 Lehigh 基准数据集作为测试数据(包括它们的测试查询)对 postgres 查询与 JDBC 的命令行执行进行一些基准测试。

除了我尝试使用 psql 执行单个字符串查询时,其他一切都工作正常。

查询是我使用

创建和执行的字符串
Runtime.getRuntime().exec("time ./psql  -U lehigh -d lehigh  -c 'SELECT u.id FROM undergraduatestudent u;';")

它在 mac 命令行上工作正常,但是当 运行 从 Java 中运行时,我得到以下错误:

---> psql: warning: extra command-line argument "u.id" ignored
---> psql: warning: extra command-line argument "FROM" ignored
---> psql: warning: extra command-line argument "undergraduatestudent" ignored
---> psql: warning: extra command-line argument "u;';" ignored
---> ERROR:  unterminated quoted string at or near "'SELECT"
---> LINE 1: 'SELECT
--->         ^

基本上 "SELECT" 之后的所有内容都不会被识别为查询的一部分。有 14 个查询发生这种情况,但这是最短的一个,足以解决问题。

我试过将 -U 和 -d 移到后面,正如另一个 post 中所建议的那样,但我得到了相同的结果。

我在 Capitan 的 Mac 上 运行 在 Eclipse 中执行此操作(尽管我不相信这些事情中的任何一个对事情有影响)。

我知道 -f 选项,但我必须为每个查询计时,所以我更喜欢 -c 选项。

据我所知,exec(String) 使用空格作为分隔符,因此您的查询不会被视为单个参数,而是被视为一组参数 ('SELECT, u.id, FROM, undergraduatestudent, and u;')。

尝试使用 exec(String[]) 版本,其中 String[] 是这样的:

{"time", "./psql", "-U", "lehigh", "-d", "lehigh",  "-c", "'SELECT", "u.id", "FROM", "undergraduatestudent u;'"}`

或者,更好的是,使用 ProcessBuilder:

new ProcessBuilder(new String[]{"time", "./psql", "-U", "lehigh", "-d", "lehigh",  "-c", "'SELECT", "u.id", "FROM", "undergraduatestudent u;'"}).start();