如何在 shell 脚本中执行 psql 时添加 shell 命令
How to add shell commands while executing psql in shellscript
目前我正在编写一个 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")" | 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
有什么方法可以找回吗?
更新
使用 coprocess 应该可以完美地工作。
对于那些遇到同样问题的人
UNIX Co process
psql
实际上没有任何类型的流量控制,所以没有。您可以使用 \!
命令来 运行 shell,但是由于您不能根据它做出流量控制决策,因此它不会帮助您。
相反,反转控制。让您的 shell 脚本控制 psql
并根据 psql
输出做出决定。 运行 psql -qAtX
所以你只能得到元组输出。
通常 运行 多次 psql
就足够了,但对于更复杂的情况,您可以 run it as a coprocess。我发现到那时它开始变得更有用,从一种可以更好地集成查询的语言编写脚本,比如 python3
的 psycopg2
.
目前我正在编写一个 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")" | 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
有什么方法可以找回吗?
更新 使用 coprocess 应该可以完美地工作。 对于那些遇到同样问题的人 UNIX Co process
psql
实际上没有任何类型的流量控制,所以没有。您可以使用 \!
命令来 运行 shell,但是由于您不能根据它做出流量控制决策,因此它不会帮助您。
相反,反转控制。让您的 shell 脚本控制 psql
并根据 psql
输出做出决定。 运行 psql -qAtX
所以你只能得到元组输出。
通常 运行 多次 psql
就足够了,但对于更复杂的情况,您可以 run it as a coprocess。我发现到那时它开始变得更有用,从一种可以更好地集成查询的语言编写脚本,比如 python3
的 psycopg2
.