将SQL查询提供给PSQL命令行的方法

时间:2019-04-19 13:36:12

标签: java bash postgresql psql

我正在寻找-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);'"

那为什么通过Java库的Exec无法正常工作?

还有其他方法可以将Alter SQL查询提供给PSQL命令吗?

2 个答案:

答案 0 :(得分:0)

  

还有其他方法可以将Alter SQL查询提供给PSQL命令吗?

您可以通过STDIN传递查询。

  

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

不能肯定地说,但对我来说,您似乎缺少传递给-c的{​​{1}}参数的引号:

bash

您要构建的命令将是:

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

或者更好,执行该命令并通过STDIN传递查询:

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

答案 1 :(得分:0)

问题出在;

对于任何在看这个问题的人,请不要使用kubernetes api来考虑;为EOF,因此找不到匹配的报价。

我删除了;及其工作。