[Shell]Shellでpostgresの複雑なトランザクション制御方法

August 2, 2017

問題

psqlでSQLを指定して実行できるが、例えば複数SQLを同時に実行させ、また前のSQLの結果によって、続行するかしないかという条件付きの複雑SQLを実行することができない。

今回以下のようにShell scriptを作りたい。

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 ...;
  # other database stubs

  # addtional operations like logging come here
  printMsg "Querying ..."

  # mix of conditional shell and psql command
  if [ some accepted condition ] commit;
  if [ some bad conditions ] rollback;
  if [ should do more database query ] do some CRUD actions
  
  commit;
EOF

解決方法

shellSQLが混在する為、単純のpsqlに制御コマンドを入れることができない。

ちなみに、db2はこのようなshellscriptを簡単に作れる。

ここで、coprocを使えば、実現可能なことがわかった。

coproc の詳細はstackoverflow ですごいわかりやすい回答があるので、ご参考ください。

psqlをバックグラウンドで動かせる

psqlにSQLを取り入れる

SQLの実行結果を確認する

Initializing...