2017-08-06 156 views
2

当前我正在编写一个shell脚本,用于在数据库上执行批处理作业,并且希望在执行psql时将shell脚本操作写入日志文件或在某些情况下执行回滚。 像这样如何在shellcript中执行psql时添加shell命令

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

有什么办法找回吗?

UPDATE 使用coprocess应该完美地工作。 对于遇到同样问题的人 UNIX Co process

回答

1

psql实际上没有任何一种流量控制,所以没有。您可以使用\!命令来运行shell,但由于您无法根据此决定流控制决策,因此它不会对您有所帮助。

而是反转控制。让你的shell脚本控制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。当我运行终端时,终端表示coproc未找到,但如果直接在终端中运行,coproc工作。我应该在这里做什么设置? –

+1

谢谢,原因是我的bash版本不支持coproc(v3.2),因为苹果不更新sh,所以使用zsh或ksh应该可以很好地工作。万分感谢。它让我安心一天 –