Database 禁用psql输出中的通知

Database 禁用psql输出中的通知,database,postgresql,verbosity,Database,Postgresql,Verbosity,如何阻止psql(PostgreSQL客户端)输出通知?e、 g psql:schema/auth.sql:20:注意:CREATE TABLE/PRIMARY键将为表“users”创建隐式索引“users\u pkey” 在我看来,一个程序应该是静默的,除非它有错误,或者有其他原因输出内容。启动psql时使用--quiet 通知不是无用的,但这是我的观点 SET client_min_messages TO WARNING; 只能为会话设置或使用或使其持久化 或者你可以把它放在你的书里。也许

如何阻止psql(PostgreSQL客户端)输出通知?e、 g

psql:schema/auth.sql:20:注意:CREATE TABLE/PRIMARY键将为表“users”创建隐式索引“users\u pkey”

在我看来,一个程序应该是静默的,除非它有错误,或者有其他原因输出内容。

启动psql时使用
--quiet

通知不是无用的,但这是我的观点

SET client_min_messages TO WARNING;
只能为会话设置或使用或使其持久化


或者你可以把它放在你的书里。

也许最全面的解释是关于彼得·艾森特()

我强烈建议对原始博客进行研究和消化,但最终建议如下:

PGOPTIONS='--client-min-messages=warning' psql -X -q -a -1 -v ON_ERROR_STOP=1 --pset pager=off -d mydb -f script.sql

它可以在全局
postgresql.conf
文件中设置,也可以通过修改
client\u min\u messages
参数来设置

例如:

client_min_messages = warning

我尝试了这个线程中建议的各种解决方案(及其排列),但我无法完全抑制PSQL输出/通知

我正在执行一个
claws2postgres.sh
BASH脚本,该脚本进行一些初步处理,然后调用/执行一个PSQL.sql脚本,将1000个条目插入到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 ... ]
[victoria@victoria bash]$ time ./claws2postgres.sh
 pg_terminate_backend 
----------------------

DROP DATABASE
CREATE DATABASE
2:40:54                       ## 2 h 41 min
[victoria@victoria bash]$ 
解决方案

注意这一修改的PSQL行,其中我重定向了PSQL输出:

psql -d claws_db -f $SRC_DIR/sql/claws2postgres.sql &>> /tmp/pg_output.txt
&>/tmp/pg_output.txt
重定向将所有输出附加到输出文件,该文件也可以用作日志文件

BASH终端输出

[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 ... ]
[victoria@victoria bash]$ time ./claws2postgres.sh
 pg_terminate_backend 
----------------------

DROP DATABASE
CREATE DATABASE
2:40:54                       ## 2 h 41 min
[victoria@victoria bash]$ 
监控进度:

[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
在另一个终端中,执行

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
  • whilekill-0$PID>/dev/null 2>&1;执行…
    :当脚本运行时,执行
  • cat/tmp/pg_output.txt | wc-l
    :使用输出文件行计数作为进度指示器
  • 完成后,通过播放
    phaser.wav
    5次来通知
  • 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

参考资料

  • [回复:解决方案,如上]
  • [回复:这条线索]
  • [相关SO线程]

  • [与解决方案相关]


提供一个对我的特定场景有用的建议:

  • Windows命令shell调用psql.exe调用以执行一个基本SQL命令
  • 只希望看到警告或错误,并抑制通知
例如:

client_min_messages = warning
psql.exe-c“将客户端消息设置为警告;如果存在mytab级联,则删除表”

(我无法将PGOPTIONS作为Windows环境变量使用--无法计算出正确的语法。尝试了不同帖子中的多种方法。)

有趣。。。这就关闭了所有的东西,比如
CREATE TABLE
,但不包括
通知的内容
,我不确定我真的认为它们都是无用的。。。但我确实有一点信念(我想我是在一本必读的C或Unix书籍中读到的),程序应该是安静的,除非它们有问题或者你告诉它们不要这样。因此--quiet应该是默认值,并且应该有一个--verbose(可能有可定制的级别)通知对我来说仍然可见:SQL“altertablefoodropconstraint if exists check_-bar”。输出:“注意:关系“foo”的约束“check_bar”不存在,跳过“这删除了恼人的”寻呼机使用已关闭。“消息对我来说,因此我从现在开始在
psql
脚本中使用
-q
。谢谢。这也可以在postgresql.conf中更改。。。或者在
connect
之后,通过任何DBI界面使用一些命令,如
do
execute
。感谢您分享这篇文章,它非常有帮助。一般不赞成只使用链接来回答,但我同意这是一篇非常有信息量的博客文章。请考虑提取一些关键点,并在答案中总结它们,以及链接。实际上,这个答案与@加文仅用相关的部分进行了相同的回答。