如何用until循环重试嵌入heredoc的psql事务 无需额外SQL文件
解决方案
你原来的写法无法正常运行主要是两个原因:
- 没有给psql配置错误终止返回的参数,默认情况下psql执行SQL遇到错误时仍会返回0退出码,until无法识别执行失败自然不会触发重试
- heredoc的格式约束没有遵守,结束标识
EOF前后不能有空格、缩进等多余字符,否则会被识别为普通内容
调整后的可用代码如下:
until psql -v ON_ERROR_STOP=1 <<-'EOF' BEGIN; Query1; Query2; COMMIT; EOF do sleep 5 done
代码说明
-v ON_ERROR_STOP=1:开启该参数后,psql执行SQL过程中只要遇到错误就会立即终止执行,同时返回非0的退出码,让until可以正确判断执行结果触发重试<<-'EOF'的短横线标识允许heredoc内容里使用制表符(Tab)缩进,方便代码排版,如果你不需要缩进SQL内容,也可以直接写<<EOF;如果需要在SQL中使用shell变量,去掉EOF的单引号即可,这样shell会先解析变量再把内容传递给psql- 注意结束的
EOF必须顶格书写,前后不能有任何多余字符
你可以用下面的测试代码验证效果:
# 测试用例:故意执行错误SQL,会每5秒重试一次 until psql -v ON_ERROR_STOP=1 <<-'EOF' BEGIN; SELECT * FROM 不存在的测试表; COMMIT; EOF do echo "事务执行失败,5秒后重试" sleep 5 done
内容的提问来源于stack exchange,提问作者ooo
相关产品推荐
相关产品推荐

