Способы передачи SQL-запроса в командную строку PSQL - PullRequest
1 голос
/ 19 апреля 2019

Я ищу другие способы, кроме -c или --command =, чтобы передавать SQL-запросы в командную строку 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);'";

Подписанзапрос select работает:

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

Тогда почему запрос Alter не работает?

Некоторый фон при необходимости:

Я использую библиотеку io.kubernetes в Java,Я хочу выполнить команду psql для контейнера с postgres.

Следующее не работает:

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 `''

Когда я использую тот же SQL-запрос с командной строкой kubernetes, он работает:

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 через java?

Есть ли другие способыпередать запросы Alter SQL команде PSQL?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Проблема была с ;

Для тех, кто смотрит на этот вопрос, пожалуйста, не рассматривайте этот kubernetes api; как EOF и, следовательно, он не может найти соответствующую цитату.

я удалил; и его работа.

0 голосов
/ 22 апреля 2019

Существуют ли другие способы передачи запросов Alter SQL команде PSQL?

Вы можете передать запрос через STDIN.

Тогда почему не работает запрос Alter?

Не могу сказать наверняка, но мне кажется, что вам не хватает кавычек для аргумента -c, который вы передаете 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? Почему бы просто не выполнить это?

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...