Отключить УВЕДОМЛЕНИЯ в выводе psql
Как мне остановить psql (клиент PostgreSQL) от вывода уведомлений? например
psql:schema/auth.sql:20: ВНИМАНИЕ: CREATE TABLE / PRIMARY KEY создаст неявный индекс "users_pkey" для таблицы "users"
По моему мнению, программа должна молчать, если в ней нет ошибки или какой-либо другой причины для вывода материала.
6 ответов
Вероятно, наиболее полное объяснение находится на записи в блоге Питера Айзентраутса здесь.
Я настоятельно рекомендую изучить и переварить оригинальный блог, но окончательная рекомендация выглядит примерно так:
PGOPTIONS='--client-min-messages=warning' psql -X -q -a -1 -v ON_ERROR_STOP=1 --pset pager=off -d mydb -f script.sql
Использование --quiet
когда вы начинаете PSQL.
Уведомление не бесполезно, но это моя точка зрения.
Это может быть установлено в глобальном postgresql.conf
файл, а также с изменением client_min_messages
параметр.
Пример:
client_min_messages = warning
Я попробовал различные предлагаемые решения (и их перестановки), предложенные в этой теме, но я не смог полностью подавить вывод / уведомления PSQL.
Я выполняю claws2postgres.sh
Сценарий BASH, который выполняет некоторую предварительную обработку, затем вызывает / выполняет сценарий PSQL .sql для вставки тысяч записей в PostgreSQL.
...
PGOPTIONS="-c client_min_messages=error"
psql -d claws_db -f claws2postgres.sql
Выход
[victoria@victoria bash]$ ./claws2postgres.sh
pg_terminate_backend
----------------------
DROP DATABASE
CREATE DATABASE
You are now connected to database "claws_db" as user "victoria".
CREATE TABLE
SELECT 1
INSERT 0 1
UPDATE 1
UPDATE 1
UPDATE 1
Dropping tmp_table
DROP TABLE
You are now connected to database "claws_db" as user "victoria".
psql:/mnt/Vancouver/projects/ie/claws/src/sql/claws2postgres.sql:33: NOTICE: 42P07: relation "claws_table" already exists, skipping
LOCATION: transformCreateStmt, parse_utilcmd.c:206
CREATE TABLE
SELECT 1
INSERT 0 1
UPDATE 2
UPDATE 2
UPDATE 2
Dropping tmp_table
DROP TABLE
[ ... snip ... ]
РЕШЕНИЕ
Обратите внимание на эту измененную строку PSQL, куда я перенаправляю вывод psql:
psql -d claws_db -f $SRC_DIR/sql/claws2postgres.sql &>> /tmp/pg_output.txt
&>> /tmp/pg_output.txt
redirect добавляет все выходные данные в выходной файл, который также может служить файлом журнала.
Вывод терминала BASH
[victoria@victoria bash]$ time ./claws2postgres.sh
pg_terminate_backend
----------------------
DROP DATABASE
CREATE DATABASE
2:40:54 ## 2 h 41 min
[victoria@victoria bash]$
Мониторинг прогресса:
В другом терминале выполните
PID=$(pgrep -l -f claws2postgres.sh | grep claws | awk '{ print $1 }'); while kill -0 $PID >/dev/null 2>&1; do NOW=$(date); progress=$(cat /tmp/pg_output.txt | wc -l); printf "\t%s: %i lines\n" "$NOW" $progress; sleep 60; done; for i in seq{1..5}; do aplay 2>/dev/null /mnt/Vancouver/programming/scripts/phaser.wav && sleep 0.5; done
...
Sun 28 Apr 2019 08:18:43 PM PDT: 99263 lines
Sun 28 Apr 2019 08:19:43 PM PDT: 99391 lines
Sun 28 Apr 2019 08:20:43 PM PDT: 99537 lines
[victoria@victoria output]$
pgrep -l -f claws2postgres.sh | grep claws | awk '{ print $1 }'
получает PID скрипта, назначенный $ PIDwhile kill -0 $PID >/dev/null 2>&1; do ...
: пока этот скрипт работает, делай...cat /tmp/pg_output.txt | wc -l
: использовать количество строк выходного файла в качестве индикатора прогресса- когда закончите, сообщите, играя
phaser.wav
5 раз - phaser.wav: https://persagen.com/files/misc/phaser.wav
Выходной файл:
[victoria@victoria ~]$ head -n22 /tmp/pg_output.txt
You are now connected to database "claws_db" as user "victoria".
CREATE TABLE
SELECT 1
INSERT 0 1
UPDATE 1
UPDATE 1
UPDATE 1
Dropping tmp_table
DROP TABLE
You are now connected to database "claws_db" as user "victoria".
psql:/mnt/Vancouver/projects/ie/claws/src/sql/claws2postgres.sql:33: NOTICE: 42P07: relation "claws_table" already exists, skipping
LOCATION: transformCreateStmt, parse_utilcmd.c:206
CREATE TABLE
SELECT 1
INSERT 0 1
UPDATE 2
UPDATE 2
UPDATE 2
Dropping tmp_table
DROP TABLE
Рекомендации
- [re: solution, выше] PSQL: Как я могу предотвратить любой вывод в командной строке?
- [re: этот поток SO] отключить УВЕДОМЛЕНИЯ в выводе psql
[связанная ветка SO] Postgresql - есть ли способ отключить отображение операторов INSERT при чтении из файла?
[относится к решению] https://askubuntu.com/questions/350208/what-does-2-dev-null-mean
The > operator redirects the output usually to a file but it can be to a device. You can also use >> to append.
If you don't specify a number then the standard output stream is assumed but you can also redirect errors
> file redirects stdout to file
1> file redirects stdout to file
2> file redirects stderr to file
&> file redirects stdout and stderr to file
/dev/null is the null device it takes any input you want and throws it away. It can be used to suppress any output.
Предлагаю предложение, которое полезно для конкретного сценария, который у меня был:
- Командная оболочка Windows вызывает вызов psql.exe для выполнения одной важной команды SQL
- Только хотите видеть предупреждения или ошибки и подавлять УВЕДОМЛЕНИЯ
Пример:
psql.exe -c "SET client_min_messages TO WARNING; DROP TABLE IF EXISTS mytab CASCADE"
(Мне не удалось заставить все работать с PGOPTIONS в качестве переменной среды Windows - не смог выработать правильный синтаксис. Пробовал несколько подходов из разных сообщений.)