2017-02-17 22 views
3

У меня есть файл .sql с некоторыми линиями, которые выглядят следующим образом:Как вставлять команды из нескольких строк оболочки в Psql файл

\set buf `cat example-message.msg | base4 -w0` 
SELECT * FROM run_select(:'buf'); 

Однако это скрывает содержание example-message.msg и делает мой файл (который фактически список тестовых случаев) менее читабельны, чем хотелось бы. В идеале я смог бы вставить содержимое example-message.msg. Но это большой многострочный файл.

Я попытался с помощью здесь докторантами:

\set buf `cat <<EOF | base64 -w0 
plan { } 
EOF 
` 

Однако здесь PSQL жалуется на несогласованной строке в кавычках и в ретроспективе the docs сказать, что это не будет работать в любом случае. (But in any case, the arguments of a meta-command cannot continue beyond the end of the line.)

Далее я рассматривал как-то строит строку, которая выполняется:

SELECT $$ 
plan: {} 
$$ AS rawbuf \gset 
\set buf `echo :rawbuf | base64 -w0` 

Это не работает либо по понятным причинам. Но я, похоже, не могу изменить его. Я полагаю, что psql doesn't do variable substitution в пределах backticks.

Есть ли какой-нибудь другой метод, который мне не хватает?

ответ

2

Многострочные мета-команды не поддерживаются. В вашем случае кажется, что это круговое путешествие до base64 -w0, которое требует мета-команды. Но, похоже, вы можете избежать этого, выполнив base64 кодирование в SQL:

SELECT encode(convert_to($delim$ 
    --multi-line string 
$delim$ 
, 'UTF-8'), 'base64') AS buf \gset 

SELECT * FROM run_select(:'buf'); 

Временный :buf также можно было бы избежать, если он не имеет какой-либо другой пользы, чем быть закачиваться:

SELECT * FROM run_select(encode(convert_to($delim$ 
    --multi-line string 
$delim$ 
    , 'UTF-8'), 'base64') 
); 
+0

Спасибо за ответ! Хотя вы решили вопрос как поставленный, фактическая команда, которую я запускаю, имеет более длинный конвейер, чем просто base64. Я думаю, вы правы, что это единственный ответ, хотя я закончил тем, что написал функцию C, которая выкладывается, и позволяет мне вставлять строки с $$-deliminated, как вы предложили. – num1