使用 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();
我正在使用 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();