psql 命令静默失败

psql command is failing silently

当我从终端会话中 运行 时:

   => psql "$pg_cp_prod_conn_str"

然后执行:

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

然后它失败了:

constraint "email_too_long_ln_check" for relation "cp_user_emails" already exists

但是如果我 运行 这个:

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
)"

然后查询"succeeds"也没有报错信息!但是当我查看数据库时,它和以前一样,所以它显然要么没有到达数据库,要么静默失败..

所以当我 运行 它作为脚本而不是直接在终端中时,为什么查询没有失败/退出并显示错误消息 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 "$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
)"