Как поместить мета-команду psql в переменную psql, чтобы выполнить ее позже? - PullRequest
0 голосов
/ 04 октября 2019

Я создаю своего рода макрос для psql, помещая SQL, который я хочу запустить, в переменную psql. Я "называю" "макрос", просто написав :variablename.

например,

psql=> \set example 'SELECT 1, ''string_literal'';'
psql=> :example
 ?column? |    ?column?    
----------+----------------
        1 | string_literal
(1 row)

Пока все хорошо.

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

Как?

\set example '\a SELECT 1, ''string_literal''; \a'

не будет работать:

ERROR:  syntax error at or near "a"
LINE 1: a SELECT 1, 'string_literal';
        ^

1 Ответ

0 голосов
/ 06 октября 2019

Лучшее решение, которое я нашел на данный момент, использует следующие варианты поведения при разборе мета-команды psql:

  • Все, что находится в 'single quotes', подвергается обработке обратной строки как E-string-backslash-escapeдля \n и т. д. Это важно, потому что это означает, что \a расширяется до a, \\a расширяется до \a и т. д.
  • В пределах одной строки в кавычках одиночные кавычки могут быть экранированыудваивая их, как в SQL-литералах, '' расширяется до '.
  • За пределами строки в кавычках специальная последовательность \\ отмечает конец аргументов мета-команды и возобновляет нормальное чтение SQL.

Таким образом, можно написать:

psql=> \a\\ SELECT 1, 'string literal'; \a\\
Output format is unaligned.
?column?|?column?
1|string literal
(1 row)
Output format is aligned.

Чтобы поместить это в переменную psql, заключите ее в одинарные кавычки, удвоив обратную косую черту и удвоив любые встроенные одинарные кавычки:

psql=> \set example '\\a\\\\ SELECT 1, ''string literal''; \\a\\\\'
psql=> :example
Output format is unaligned.
?column?|?column?
1|string literal
(1 row)
Output format is aligned.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...