Не получается ловить psql ошибку с помощью bash

Рейтинг: 0Ответов: 1Опубликовано: 31.03.2023

Запускаю на сервере с помощью bash скрипт, который взаимодействует с sql таблицами. Нужно выловить ошибки, но не получается. Нижний if последняя попытка вылавливать, если что-то идет не так, но никакого успеха он не приносит. Сам psql скрипт функционален, если есть полный доступ к схеме.

#!/usr/bin/bash

if [ -z "$1" ]; then
  echo "schema name is missing"
  exit 1
fi


psql -h pg -d studs -U s314463 << EOF
DO \$\$
DECLARE
  table_rec RECORD;
  schema_name TEXT;
  table_name TEXT;
  table_count INTEGER;
  column_count INTEGER;
  index_count INTEGER;
  row_count BIGINT;
BEGIN
  schema_name = '$1';
  SELECT count(*) INTO table_count
  FROM pg_tables
  WHERE schemaname = schema_name;

  SELECT sum(numcols) INTO column_count
  FROM pg_namespace
  JOIN pg_class ON pg_namespace.oid = pg_class.relnamespace
  JOIN (
    SELECT attrelid, count(*) as numcols
    FROM pg_attribute
    WHERE attnum > 0
    GROUP BY attrelid
  ) AS cols ON pg_class.oid = cols.attrelid
  WHERE pg_namespace.nspname = schema_name
  AND pg_class.relkind = 'r';

  SELECT count(*) INTO index_count
  FROM pg_indexes
  WHERE schemaname = schema_name;

  RAISE NOTICE 'Количество таблиц в схеме % - %', schema_name, table_count;
  RAISE NOTICE 'Количество столбцов в схеме % - %', schema_name, column_count;
  RAISE NOTICE 'Количество индексов в схеме % - %', schema_name, index_count;
  RAISE NOTICE '';
  RAISE NOTICE 'Таблицы схемы % ', schema_name;
  RAISE NOTICE '';
  RAISE NOTICE ' Имя Столбцов Строк';
  FOR table_rec IN
    SELECT c.relname, count(a.attname) AS column_count, c.reltuples AS row_count
    FROM pg_class c
    LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
    LEFT JOIN pg_attribute a ON a.attrelid = c.oid
    WHERE c.relkind = 'r'
    AND n.nspname = schema_name
    AND a.attnum > 0
    GROUP BY c.relname, c.reltuples
    ORDER BY c.relname
  LOOP
    EXECUTE 'SELECT count(*) FROM ' || table_rec.relname INTO row_count;
    RAISE NOTICE ' % % %', table_rec.relname, table_rec.column_count, row_count;
  END LOOP;
END \$\$;
EOF

if [ $? != 0 ]; then
    echo "Error loading the table."
    exit 1
fi

exit 0

Ответы

▲ 0

Попробуйте вот такую опцию:

psql -v ON_ERROR_STOP=1 ...