Отключить УВЕДОМЛЕНИЯ в выводе psql

Как мне остановить psql (клиент PostgreSQL) от вывода уведомлений? например

psql:schema/auth.sql:20: ВНИМАНИЕ: CREATE TABLE / PRIMARY KEY создаст неявный индекс "users_pkey" для таблицы "users"

По моему мнению, программа должна молчать, если в ней нет ошибки или какой-либо другой причины для вывода материала.

6 ответов

Решение
SET client_min_messages TO WARNING;

Это можно установить только для сеанса или сделать постоянным с ALTER ROLE или же ALTER DATABASE,

Или вы можете поместить это в свой ".psqlrc".

Вероятно, наиболее полное объяснение находится на записи в блоге Питера Айзентраутса здесь.

Я настоятельно рекомендую изучить и переварить оригинальный блог, но окончательная рекомендация выглядит примерно так:

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 скрипта, назначенный $ PID
  • while 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

Рекомендации

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 - не смог выработать правильный синтаксис. Пробовал несколько подходов из разных сообщений.)

Другие вопросы по тегам