我正在编写一个脚本来从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...
是否有更好的方法将脚本中需要的输出路径拼凑在一起?我要解决所有这些错误吗?任何指导将不胜感激!
答案 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