PostgresQL:将部分文件路径作为命令行参数传递

时间:2019-04-09 02:58:16

标签: postgresql plpgsql

我正在编写一个脚本来从PostgreSQL实例中导出数据的子集,而尝试以编程方式构造输出文件路径时遇到了麻烦。

我想做的事情是这样的:

psql -d mydb -f my_script.sql -v out_path="'/path/to/my/output/dir/'"

我尝试使用以下简单示例

COPY my_table TO :out_path || 'file.csv' WITH CSV;

但这会导致以下错误:

psql:my_script.sql:4: ERROR:  syntax error at or near "||"
LINE 1: ...path/to/my/output/dir/' || 'my_tabl...

是否有更好的方法将脚本中需要的输出路径拼凑在一起?我要解决所有这些错误吗?任何指导将不胜感激!

1 个答案:

答案 0 :(得分:1)

在这种情况下,您不应使用运算符||。它是SQL运算符,并且COPY不允许在其中进行表达式。

psql变量在默认情况下是串联的。因此,在这种情况下,||运算符是无用的。

\set out_path /path/to/my/output/dir/
\echo :out_path/file_csv

postgres=# \set out_path /path/to/my/output/dir/
postgres=# \echo :out_path/file_csv
/path/to/my/output/dir//file_csv

如果不以超级用户身份运行此脚本,则无法写入服务器文件系统。在超级用户下执行这些操作是不好的。因此,您可能会使用\COPY命令,该命令与客户端文件系统结合在一起。

因此您的脚本可以如下所示:

-- does concat too
\set file_path :out_path 'file.csv' 
\copy my_table to :file_path csv