如何在psql文件中嵌入多行shell命令

时间:2017-02-17 21:42:45

标签: postgresql psql

我有一个.sql文件,其中包含一些如下所示的行:

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

但是,这会隐藏example-message.msg的内容并使我的文件(实际上是一个测试用例列表)的可读性低于我想要的。理想情况下,我能够内联example-message.msg的内容。但它是一个大型的多行文件。

我尝试过使用here-docs:

\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

我还缺少其他一些方法吗?

1 个答案:

答案 0 :(得分:2)

确实不支持多行元命令。在你的情况下,它似乎是base64 -w0的往返要求一个元命令。但看起来你可以通过在SQL中执行base64编码来避免这种情况:

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')
);