2017-08-06 15 views
2

現在、私はデータベース上でバッチジョブを実行するシェルスクリプトを作成していますが、psqlを実行しているときにログファイルに書き込むかロールバックするようなシェルスクリプトアクションを入れたいと思います。このシェルスクリプトでpsqlを実行中にシェルコマンドを追加する方法

ConnectDb() { 
 
\t PGPASSWORD=postgres psql -U postgres database -t -A -F , -v ON_ERROR_STOP=1 -v AUTOCOMMIT=0 
 
} 
 

 
printMsg() { 
 
\t 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

同様 はそれを取得する方法はありますか?

更新 使用コプロセッサは完全に動作するはずです。 同じ問題を抱えた人のために UNIX Co process

答えて

1

psqlフロー制御はありません。 \!コマンドを使用してシェルを実行することはできますが、それに基づいてフロー制御の決定を行うことはできません。

代わりに、反転制御。シェルスクリプトでpsqlを制御し、psql出力に基づいて決定してください。 psql -qAtXを実行すると、タプル出力しか得られません。

通常、バンチタイムではpsqlを実行するだけで十分ですが、より複雑なケースでは、run it as a coprocessとすることができます。その点では、python3psycopg2のように、クエリをよりよく統合できる言語からスクリプトを作成する方が便利だということがわかりました。

+0

coprocessは私のための最良の選択だと思われますが、coprocへの接続を変更するとPGPASSWORD = postgres psql -U postgresデータベース-t -A -F、-v ON_ERROR_STOP = 1 -v AUTOCOMMIT = 0 -q。私がbashを実行すると、ターミナルは端末で直接実行された場合、coprocは見つかりませんでしたが、coprocの作業は見つかりませんでした。私はここで何をセットアップすべきですか? –

+1

アップルがshを更新していないので、zshまたはkshを使って完全に動作するはずですので、私のbashバージョンはcoproc(v3.2)をサポートしていません。大いに感謝する。それは私にとって安全な日です –

関連する問題