#java #bash #postgresql #psql
#java #bash #postgresql #psql
Вопрос:
Я ищу другие способы, отличные от -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);'";
Следующий запрос выбора работает:
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();
В inputstream я получаю следующую ошибку:
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?
Комментарии:
1. Есть ли причина, по которой вы не можете использовать JDBC?
Ответ №1:
Существуют ли какие-либо другие способы передачи запросов 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();
Комментарии:
1. Параметр stdIN является логическим, следовательно, не может передавать запрос таким образом
2. Мой плохой. Тем не менее, я думаю, вы могли бы остановиться
bash
здесь.
Ответ №2:
Проблема заключалась в ;
Для тех, кто смотрит на этот вопрос, пожалуйста, не этот api kubernetes рассматривает; как EOF и, следовательно, он не может найти соответствующую цитату.
Я удалил; и он работает.