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
)"
当我从终端会话中 运行 时:
=> 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
)"