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

标签 java postgresql command-line psql

我正在使用 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 移到后面,正如另一篇文章中所建议的那样,但我得到了相同的结果。

我在 Capitan 的 Mac 上的 Eclipse 中运行它(尽管我不相信这些东西对事情有影响)。

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

最佳答案

据我所知,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();

关于java - 使用 Java exec 的额外 psql 命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502349/

相关文章:

command-line - 如何通过命令行手动禁用Fail2Ban IP?

java - 在游戏中随机生成物体

command-line - 批量启动命令未打开程序

java.lang.IllegalStateException : Could not execute method of the activity error after changing package name

postgresql - 如何以非root用户身份在docker中运行postgres?

mysql - Django 从 MySQL 迁移到 Postgres

node.js - 如何在sequelize中使用group by子句获取嵌套对象

来自命令行的 Xcode "Build and Archive"

java - 将 MouseListener 或 MouseMotionListener 添加到我的 JLabel(位于我的西洋棋棋盘中的 Jpanel 内部)

Java Enum.valueOf() 值不存在时的效率