我正在寻找-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命令吗?
答案 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,因此找不到匹配的报价。
我删除了;及其工作。