【问题标题】:Ways to give SQL Query to PSQL Command line将 SQL 查询提供给 PSQL 命令行的方法
【发布时间】:2019-09-09 18:39:11
【问题描述】:

我正在寻找除 -c 或 --command= 以外的不同方式来向 PSQL 命令行提供 SQL 查询。

有什么替代方法:

String command2 = "psql --dbname=postgresql://postgres:password@127.0.0.1:1234/db123 -c 'ALTER TABLE audit ALTER COLUMN event TYPE character varying(3000);'";

以下选择查询有效:

String command2 = "psql --dbname=postgresql://postgres:password@127.0.0.1:1234/db123 -c 'SELECT * FROM audit'";

那为什么Alter查询不起作用呢?

如果需要一些背景:

我在 Java 中使用 io.kubernetes 库。我想用 postgres 在容器上执行 psql 命令。

以下不起作用:

String command2 = "psql --dbname=postgresql://postgres:password@127.0.0.1:1234/db123 -c 'ALTER TABLE audit ALTER COLUMN event TYPE character varying(3000);'";

String command[]  = new String[] { "bash", "-c", command2 };
Exec exec = new Exec();
Process exec2 = exec.exec(namespace, podName, command, dbContainerName, stdIn, stdOut);
Thread.sleep(10000);
exec2.destroy();

在输入流中,我收到以下错误:

bash: -c: line 0: unexpected EOF while looking for matching `''

当我在 kubernetes 命令行中使用相同的 sql 查询时,它可以工作:

kubectl exec -it pod -c container -- bash -c "psql --dbname=postgresql://postgres:password@127.0.0.1:1234/db123 -c 'ALTER TABLE audit ALTER COLUMN event TYPE character varying(3000);'"

那为什么 Exec through java 库不起作用呢?

还有其他方法可以将 Alter SQL 查询赋予 PSQL 命令吗?

【问题讨论】:

  • 不能使用JDBC有什么原因吗?

标签: java bash postgresql psql


【解决方案1】:

还有其他方法可以将 Alter SQL 查询赋予 PSQL 命令吗?

您可以通过 STDIN 传递查询。

那为什么Alter查询不起作用呢?

不能肯定,但在我看来,您传递给 bash-c 参数缺少引号:

String command2 = "psql --dbname=postgresql://postgres:password@127.0.0.1:1234/db123 -c 'ALTER TABLE audit ALTER COLUMN event TYPE character varying(3000);'";
String command[]  = new String[] { "bash", "-c", command2 };

您正在构建的命令将是:

bash -c psql --dbname=postgresql://postgres:password@127.0.0.1:1234/db123 -c 'ALTER TABLE audit ALTER COLUMN event TYPE character varying(3000);'

什么时候应该:

bash -c "psql --dbname=postgresql://postgres:password@127.0.0.1:1234/db123 -c 'ALTER TABLE audit ALTER COLUMN event TYPE character varying(3000);'"

但是为什么要把它传递给bash?为什么不简单地执行呢?

psql --dbname=postgresql://postgres:password@127.0.0.1:1234/db123 -c 'ALTER TABLE audit ALTER COLUMN event TYPE character varying(3000);'

或者更好的是,执行它并通过 STDIN 传递查询:

String query = "ALTER TABLE audit ALTER COLUMN event TYPE character varying(3000)";
String command[] = new String[] { "psql", "--dbname=postgresql://postgres:password@127.0.0.1:1234/db123" };
Exec exec = new Exec();
Process exec2 = exec.exec(namespace, podName, command, dbContainerName, query, stdOut);
Thread.sleep(10000);
exec2.destroy();

【讨论】:

  • stdIN 参数是布尔值,因此不能这样传递查询
  • 我的错。不过,我想你可以在这里放弃bash
【解决方案2】:

问题在于;

对于任何看这个问题的人,请不要考虑这个 kubernetes api;作为 EOF,因此它无法找到匹配的报价。

我删除了;及其工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多