Как я могу запустить несколько команд с клиентом PSQL - PullRequest
0 голосов
/ 10 апреля 2020

Я пытался запустить несколько команд через клиент psql, чтобы подключиться к удаленной базе данных и выполнить несколько команд в одной строке, но кажется, что это невозможно?

Я пытался запустить ниже команда, и это дает мне прямую ошибку после выполнения первой команды. У меня все переменные bash установлены в окружении.

PGPASSWORD=${ADMIN_PASSWORD} psql -h ${REMOTE_HOST} -U postgres -d ${SOME_DATABASE} -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' -c "CREATE USER '$DB_USER' WITH PASSWORD '${DB_PASSWORD}';" -c 'GRANT ALL PRIVILEGES ON DATABASE "${DB_DATABASE}" TO "${DB_USER}";'

, когда я запускаю это, похоже, что только первая команда была успешной, я прочитал инструкцию из psql help -c, --command=COMMAND run only single command (SQL or internal) and exit.

Но есть ли способ использовать bash pipe или backsla sh, чтобы использовать его таким образом?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Спасибо, я думаю, что смог просто передать несколько команд с помощью приведенного ниже. Кто-нибудь считает, что это проблема, если у меня есть другой тип имен, таких как da sh (-) и несколько da sh в имени БД и имени пользователя?

Мои bash переменные были установлены ранее. Таким образом, приведенное ниже решение дает сбой, если имя пользователя или имя базы данных имеет значение da sh '-'. Также DB_PASSWORD должен поставляться с одной кавычкой.

echo 'CREATE USER '${USER}' WITH PASSWORD '$DB_PASSWORD'; GRANT ALL PRIVILEGES ON DATABASE '${DB}' TO "${USER}";' | PGPASSWORD=mysecretpassword psql -U postgres -d ${DB}
CREATE ROLE
GRANT

0 голосов
/ 10 апреля 2020

У вас есть паразитная задняя планка sh, которая наверняка испачкает вещи.

- c "CREATE USER '$ DB_USER' ..."

Имя пользователя должно быть заключено в кавычки или заключено в двойные кавычки. Кавычки с одинарными кавычками не допускаются.

- c 'ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА БАЗЕ ДАННЫХ "$ {DB_DATABASE}" ...'

Подстановка переменных оболочки не встречается внутри строк, выделенных крайними одинарными кавычками, поэтому это ссылка на буквальную строку "${DB_DATABASE}".

Если вам нужны также буквальные двойные кавычки и подстановка переменных, вы можете использовать одинарные кавычки но останавливая их перед переменной, поднимая после. Или используйте двойные кавычки, но избегая буквальных двойных кавычек. (Это с bash, я не знаю о других оболочках)

$ export foo=bar-baz
$ echo 'here is "'$foo'" within quotes'
here is "bar-baz" within quotes
$ echo "here is \"$foo\" within quotes"
here is "bar-baz" within quotes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...