Выполнить sql запросов из сценария оболочки - PullRequest
0 голосов
/ 12 марта 2020

Мне нужно выполнить следующие sql запросы из скрипта bash / Ожидается, какой предпочтительный подход для запуска этих запросов из bash script

# psql ambari -U ambari
Password for user ambari:
psql (9.2.24)
Type "help" for help.

ambari=>
ambari=>
ambari=>
ambari=> select
ambari-> sum(case when ulo = 1  then 1 else 0 end) as ulo_1,
ambari-> sum(case when ulo = 2  then 1 else 0 end) as ulo_2,

.
.
.

для доступа PostgreSQL мы делаем

psql ambari -U ambari
Password for user ambari:bigdata

и когда мы запустим это (/ tmp / file включает в себя bach запроса)

 psql -U ambari -f /tmp/file  ambari

мы получим

psql: FATAL:  no pg_hba.conf entry for host "[local]", user "ambari", database "ambari", SSL off

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Я использую это

dbhost=localhost
dbport=5432
dbuser=user
dbpass=pass
dbname=test
export PGPASSWORD="$dbpass"
dbopts="-h $dbhost -p $dbport -U $dbuser -d $dbname"

Затем запустите sql скрипт из файла

psql $dbopts < "$path_to_sql_script"

Или из запроса var

query="
SELECT 1;
...
"
psql $dbopts <<< "$query"

Также pgpass может быть установленным в специальный файл ~/.pgpass вот так

echo "$dbhost:$dbport:$dbname:$dbname:$dbpass" > ~/.pgpass
chmod 600 ~/.pgpass
1 голос
/ 12 марта 2020

Используйте переключатели -c command или -f filename, ie.:

$ psql -U ambari -c "SELECT ... ;" ambari    # > result.file

или:

$ cat file.sql
SELECT
... ;
$ psql -U ambari -f file.sql ambari          # > result.file

Возможно -f, поскольку ваш запрос кажется длинным. Используйте > result.file для сохранения результата запроса в файле.

Что касается пароля, сохраните следующий вид записи в файле .pgpass в домашнем каталоге пользователя:

$ cat >> ~/.pgpass
#hostname:port:database:username:password
localhost:5432:ambari:ambari:t00M4NY53CR3t5

и установите его права только для глаз пользователя:

$ chmod 600 ~/.pgpass

Кроме того, рассмотрите psql -h hostname, если база данных не работает на локальном хосте (это также должно быть отражено в записи .pgpass).

...