Показаны сообщения с ярлыком psql. Показать все сообщения
Показаны сообщения с ярлыком psql. Показать все сообщения

среда, 20 ноября 2019 г.

Условное выполнение команд в psql


Для выполнения команд по условию в psql имеется конструкция \if. Например, нам нужен аналог CREATE .. IF NOT EXISTS для слотов репликации:

SELECT NOT EXISTS (SELECT NULL FROM pg_replication_slots WHERE slot_name = 'replica') AS is_not_exists
\gset

\if :is_not_exists
    SELECT pg_create_physical_replication_slot('replica');
\endif


То же самое можно сделать c \gexec. И  без промежуточной переменной:

SELECT 'SELECT pg_create_physical_replication_slot(''replica'')'
 WHERE NOT EXISTS (SELECT NULL FROM pg_replication_slots WHERE slot_name = 'replica')
\gexec

среда, 31 мая 2017 г.

Работа с системным каталогом

Основные таблицы системного каталога и команды psql для работы с ними.

пятница, 18 марта 2016 г.

psql и ON_ERROR_ROLLBACK

Название этой psql-переменной подсказывает, что если ее установить, то ошибочная команда будет приводить к откату транзакции: при ошибке - откат.
Как-то так:

postgres=# begin;
BEGIN
postgres=# select1+1;
ERROR:  syntax error at or near "select1"
LINE 1: select1+1;
        ^
postgres=# commit;
ROLLBACK


Такое поведение psql сильно раздражает. Из-за любой случайной ошибки при наборе команды приходится терять всю транзакцию.
Только вот переменная ON_ERROR_ROLLBACK не виновница, а наоборот, призвана помочь в таких ситуациях.

postgres=# \set ON_ERROR_ROLLBACK ON
postgres=# begin;
BEGIN
postgres=# select1+1;
ERROR:  syntax error at or near "select1"
LINE 1: select1+1;
        ^
postgres=# commit;
COMMIT


Если переменная установлена, а по умолчанию это не так, то psql перед выполнением каждой команды неявно устанавливает точку сохранения и при ошибке откатывается к ней. Что позволяет продолжить основную транзакцию.

Можно установить значение переменной в INTERACTIVE, тогда такое поведение будет распространяться только на сеансы интерактивной работы, что собственно и нужно.


Строка \set ON_ERROR_ROLLBACK INTERACTIVE определенно заслуживает место в .psqlrc