Как добавить команды оболочки при выполнении psql в шеллскрипте
В настоящее время я пишу сценарий оболочки, который выполняет пакетную работу с базой данных, и я хочу поместить в сценарий действие сценария оболочки, такое как запись в файл журнала или откат, при выполнении psql. Как это
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
Есть ли способ получить это?
ОБНОВЛЕНИЕ использовать сопроцесс должен работать отлично. Для тех, кто сталкивался с такой же проблемой UNIX Co процесса
1 ответ
psql
на самом деле нет никакого контроля потока, так что нет. Вы можете использовать \!
команда для запуска оболочки, но так как вы не можете принимать решения по управлению потоком на ее основе, это вам не поможет.
Вместо этого инвертируйте контроль. Управляйте своим сценарием оболочки psql
и принимать решения на основе psql
выход. Бежать psql -qAtX
так что вы получите только кортеж.
Обычно просто работает psql
достаточно много раз, но для более сложных случаев вы можете запустить его как сопроцесс. Я обнаружил, что к этому моменту становится все более полезным для сценариев на языке, где вы можете лучше интегрировать запросы, например, python3
"s psycopg2
,