将远程 Postgres 表导出到本地机器上的 CSV 文件

tas*_*ski 20 postgresql export copy csv

我对远程服务器上的数据库具有只读访问权限。所以,我可以执行:

COPY products TO '/tmp/products.csv' DELIMITER ',';
Run Code Online (Sandbox Code Playgroud)

但是在该服务器上我没有创建/保存文件的权限,所以我需要在我的本地机器上执行此操作。

当我连接到远程数据库时,如何执行命令将文件保存在本地计算机而不是远程服务器上?

或者,如何执行 Linux 命令以连接到远程数据库、执行查询并将输出作为文件保存到我的本地计算机?

Cra*_*ger 34

已经建议的两种方法似乎都不必要地复杂。

只需使用psql的内置\copy命令,它的工作方式与服务器端类似,COPY但会通过有线协议将副本复制到客户端并使用客户端路径。

因为它是一个psql反斜杠命令,所以省略了尾随的分号,例如:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅命令手册中\copy条目psqlCOPY命令文档

就像COPY你可以使用\copy一个(SELECT ...)(在而非)复制数据时进行查询,而不是表名。


在少数有限情况下可能有用的通常较差的替代方案是使用:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'
Run Code Online (Sandbox Code Playgroud)

并使用-o标志或 shell 输出重定向将输出写入文件。你应该几乎总是\copy优先使用这个。

  • 嗯,当然可以。使用 here-document 为 `psql` 提供一个脚本,从 `BEGIN` 开始,然后执行你的 `\copy` 命令,然后是 `COMMIT`。或者使用 `psql -f` 来运行脚本而不是使用 here-document。 (2认同)