【问题标题】:psql command is failing silentlypsql 命令静默失败
【发布时间】:2020-06-12 07:48:42
【问题描述】:

当我从终端会话运行时:

   => psql "$pg_cp_prod_conn_str"

然后执行:

   => ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_too_long_ln_check CHECK (char_length(TRIM(email)) < 320);

然后它失败了:

为关系“cp_user_emails”约束“email_too_long_ln_check” 已经存在

但是如果我运行这个:

psql "$pg_cp_prod_conn_str" -c "$(<<EOF

ALTER TABLE cp_user_emails
  ADD CONSTRAINT email_non_zero_ln_check CHECK (char_length(TRIM(email)) > 4);

ALTER TABLE cp_user_emails
  ADD CONSTRAINT email_too_long_ln_check CHECK (char_length(TRIM(email)) < 321);

EOF
)"

然后查询“成功”并且没有错误消息!但是当我查看数据库时,它和以前一样,所以很明显要么没有到达数据库,要么默默地失败了..

那么为什么当我将它作为脚本而不是直接在终端中运行时,查询不是失败/退出并显示错误消息?

【问题讨论】:

    标签: linux postgresql shell psql


    【解决方案1】:

    你的第二个陈述是一样的

    psql "$pg_cp_prod_conn_str" -c "$()"
    

    因为该命令忽略了它的标准输入

    如果您想在psql 中使用“此处的文档”,请执行以下操作:

    psql "$pg_cp_prod_conn_str" <<EOF
    ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_non_zero_ln_check CHECK (char_length(TRIM(email)) > 4);
    
    ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_too_long_ln_check CHECK (char_length(TRIM(email)) < 321);
    
    EOF
    

    【讨论】:

    • 不幸的是我得到了psql: option requires an argument -- 'c'
    • 所以如果我使用-c 那么它后面需要一个字符串
    • 我想通了,添加了一个答案
    • @AlexChannelmeter 您不需要-c 选项,如我的回答所示。
    【解决方案2】:

    这行得通:

    psql "$pg_cp_prod_conn_str" -f <(cat <<EOF
    
    ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_non_zero_ln_check CHECK (char_length(TRIM(email)) > 4);
    
    ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_too_long_ln_check CHECK (char_length(TRIM(email)) < 321);
    
    EOF
    )
    

    但这不是:

    psql "$pg_cp_prod_conn_str" -c "$(<<EOF
    
    ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_non_zero_ln_check CHECK (char_length(TRIM(email)) > 4);
    
    ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_too_long_ln_check CHECK (char_length(TRIM(email)) < 321);
    
    EOF
    )"
    

    但我意识到我需要用 cat 阅读它,所以这很有效:

    psql "$pg_cp_prod_conn_str" -c "$(cat <<EOF
    
    ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_non_zero_ln_check CHECK (char_length(TRIM(email)) > 4);
    
    ALTER TABLE cp_user_emails
      ADD CONSTRAINT email_too_long_ln_check CHECK (char_length(TRIM(email)) < 321);
    
    EOF
    )"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 2017-01-10
      • 2018-09-30
      • 1970-01-01
      相关资源
      最近更新 更多