【问题标题】:disable NOTICES in psql output在 psql 输出中禁用 NOTICES
【发布时间】:2011-04-01 15:22:00
【问题描述】:

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

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

在我看来,一个程序应该保持沉默,除非它有错误,或者有其他原因输出东西。

【问题讨论】:

    标签: database postgresql verbosity


    【解决方案1】:
    SET client_min_messages TO WARNING;
    

    That 可以只为会话设置或使用ALTER ROLEALTER DATABASE 持久化。

    或者你可以把它放在你的".psqlrc"

    【讨论】:

    • 这也可以在 postgresql.conf 中更改
    【解决方案2】:

    可能最全面的解释是关于 Peter Eisentrauts blog entry here (Archive)

    我强烈建议对原始博客进行研究和消化,但最终的建议是这样的:

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

    【讨论】:

    • 感谢您分享这篇文章,非常有帮助。
    • 通常不赞成只用一个链接来回答,但我同意这是一篇内容丰富的博文。请考虑提取一些关键点并在您的答案中进行总结,并附上链接。
    【解决方案3】:

    启动 psql 时使用--quiet

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

    【讨论】:

    • 有趣...关闭所有像CREATE TABLE 但不是NOTICE's 我不确定我是否真的认为所有这些都是无用的...但我确实有有点相信(我想我是在一本必读的 C 或 Unix 书籍中读到的)程序应该安静,除非它们有问题或者你告诉他们不要。所以 --quiet 应该是默认值,并且应该有一个 --verbose (可能具有可自定义的级别)
    • 通知对我来说仍然可见:SQL“如果存在 check_bar,则更改表 foo 删除约束”。输出:“注意:关系“foo”的约束“check_bar”不存在,正在跳过”
    • 这消除了烦人的“寻呼机使用已关闭”。给我的消息,所以我从现在开始在psql 脚本中采用-q。谢谢。
    【解决方案4】:

    也可以通过修改client_min_messages参数在全局postgresql.conf文件中设置。

    例子:

    client_min_messages = warning
    

    【讨论】:

    • 实际上这个答案与@Gavin 发布的只是相关部分相同。
    【解决方案5】:

    我尝试了此线程中建议的各种解决方案(及其排列),但我无法完全抑制 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,分配给 $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.
    

    【讨论】:

      【解决方案6】:

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

      • Windows 命令外壳调用 psql.exe 调用来执行一个必要的 SQL 命令
      • 只想看到警告或错误,并禁止通知

      例子:

      psql.exe -c "SET client_min_messages TO WARNING; DROP TABLE IF EXISTS mytab CASCADE"
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        • 2014-11-26
        • 2012-03-25
        • 2012-04-01
        • 1970-01-01
        相关资源
        最近更新 更多