2

目前我正在编写一个在数据库上执行批处理作业的 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 使用协同进程应该可以正常工作。对于那些遇到同样问题的 UNIX Co 进程

4

1 回答 1

1

psql没有任何类型的流量控制,所以没有。您可以使用该\!命令来运行 shell,但由于您无法根据它做出流量控制决策,因此对您没有帮助。

相反,反转控制。让您的 shell 脚本控制psql并根据psql输出做出决策。运行psql -qAtX,以便您仅获得元组输出。

通常只运行psql一堆时间就足够了,但对于更复杂的情况,您可以将其作为 coprocess 运行。我发现到那时,从可以更好地集成查询的语言编写脚本开始变得更加有用,例如python3's psycopg2.

于 2017-08-06T01:18:02.853 回答