目前我正在编写一个在数据库上执行批处理作业的shell脚本,并且我希望在执行psql时将shell脚本操作(如写入日志文件或回滚)放在某些条件下。 喜欢这个
ConnectDb() {
PGPASSWORD=postgres psql -U postgres database -t -A -F , -v ON_ERROR_STOP=1 -v AUTOCOMMIT=0
}
printMsg() {
echo "$PROGRAM/$SUBMODULE $(date "+ %Y%H%s")" $1 | tee -a ~/Desktop/shell/log/test.log
}
ConnectDb <<EOF
start transaction;
select * from ...;
# do some database stubs here
# i want to add somthing like this
printMsg "Querying ..."
# many shell script command go here
if [ some accepted condition ] commit;
if [ some bad conditions ] rollback;
if [ should do more database query ] do insert, update, delete to database
commit;
EOF
有没有办法检索它?
UPDATE 使用coprocess应该完美地工作。 对于那些遇到同样问题的人 UNIX Co process
答案 0 :(得分:1)
psql
并没有任何流量控制,所以没有。您可以使用\!
命令运行shell,但由于您无法根据它做出流量控制决策,因此无法帮助您。
相反,反转控制。让您的shell脚本控制psql
并根据psql
输出做出决策。运行psql -qAtX
以便只获得元组输出。
通常只运行一次psql
就足够了,但对于更复杂的情况,您可以run it as a coprocess。我发现,到那时,它可以从一种可以更好地集成查询的语言开始变得更有用,例如python3
&#39; s psycopg2
。