我有一个.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。
我还缺少其他一些方法吗?
答案 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')
);