如何阻止 psql(PostgreSQL 客户端)输出通知?例如
psql:schema/auth.sql:20:注意:CREATE TABLE / PRIMARY KEY 将为表“users”创建隐式索引“users_pkey”
在我看来,一个程序应该保持沉默,除非它有错误,或者有其他原因输出东西。
如何阻止 psql(PostgreSQL 客户端)输出通知?例如
psql:schema/auth.sql:20:注意:CREATE TABLE / PRIMARY KEY 将为表“users”创建隐式索引“users_pkey”
在我看来,一个程序应该保持沉默,除非它有错误,或者有其他原因输出东西。
SET client_min_messages TO WARNING;
这可以只为会话设置或使用ALTER ROLE
or持久化ALTER DATABASE
。
或者你可以把它放在你的".psqlrc"中。
最全面的解释可能是在这里的 Peter Eisentrauts 博客条目(存档)
我强烈建议对原始博客进行研究和消化,但最终的建议是:
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 脚本,将 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 ... ]
解决方案
请注意这个修改后的 PSQL 行,我在其中重定向 psql 输出:
psql -d claws_db -f $SRC_DIR/sql/claws2postgres.sql &>> /tmp/pg_output.txt
重定向将&>> /tmp/pg_output.txt
所有输出附加到输出文件,该文件也可以用作日志文件。
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 次通知输出文件:
[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 线程] 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.
提供对我所拥有的特定场景有用的建议:
例子:
psql.exe -c "SET client_min_messages TO WARNING; DROP TABLE IF EXISTS mytab CASCADE"
(我无法将 PGOPTIONS 作为 Windows 环境变量使用——无法找出正确的语法。从不同的帖子中尝试了多种方法。)