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

时间:2015-12-28 23:34:15

标签: java postgresql command-line psql

我使用Lehigh Benchmark数据集作为测试数据,包括他们的测试查询,对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移动到其他帖子中,但是我得到了相同的结果。

我在Capitan的Mac上用Eclipse运行它(虽然我不相信这些事情都会对事情产生影响)。

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

1 个答案:

答案 0 :(得分:0)

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

尝试使用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();