使用 Postgres COPY TO 进行数据导出而不覆盖文件

Zer*_*uno 3 postgresql export psql

我正在使用脚本和 psql 运行多个查询。我还使用 COPY TO 命令将结果导出到 a.csv。但是,当我想将结果附加到 a.csv 时,这会覆盖文件 a.csv。

是否可以使用 COPY TO 语法,也许我缺少一些参数?还是我应该考虑使用其他工具?

Erw*_*ter 8

您可以在命令行上使用\copypsql(它封装 SQL COPY)中的 meta 命令,将其发送到并重定向输出以附加到文件 -而不是:stdout>>>

psql -c '\copy (SELECT 1, 2) to stdout' >> /path/to/file_to_append_to.csv
Run Code Online (Sandbox Code Playgroud)

(您可能需要更多连接参数。)
您也可以使用 SQL COPY

psql -c 'COPY (SELECT 1, 2) TO STDOUT' >> /path/to/file_to_append_to.csv
Run Code Online (Sandbox Code Playgroud)

但使用它通常更方便,\copy因为(引用手册):

文件可访问性和访问权限在使用时取决于客户端而不是服务器\copy

或者,就像Abelisto 评论的那样,从内部 psql或任何其他客户端 - 如果该程序cat可用(基本上在所有 *nix 操作系统上):

COPY (SELECT 1, 2) TO PROGRAM 'cat >> /path/to/file_to_append_to.csv'
Run Code Online (Sandbox Code Playgroud)

或者,仍然在 psql 内部,在任何系统上,您都可以使用以下命令设置当前目录和输出文件:

\cd /path/to/
\o file_to_append_to.csv
Run Code Online (Sandbox Code Playgroud)

如果文件尚不存在,则会创建(仅)该文件。
然后你也可以 SQL COPY(或者仍然\copy可以):

COPY (SELECT 1, 2) TO STDOUT;
Run Code Online (Sandbox Code Playgroud)

输出将附加到文件中。