Как добавить команды оболочки при выполнении 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,

Другие вопросы по тегам