PostgreSQL 从远程服务器将结果导出为 CSV

PostgreSQL export result as CSV from remote server

我已经阅读了所有其他解决方案并且none适应了我的需要,我不使用Java,我没有超级用户权限并且我没有API'安装在我的服务器上。

我在远程 PostgreSQL 服务器上有 select 权限,我想在其中远程 运行 查询并将其结果导出到本地服务器的 .csv 文件中。

一旦我设法建立与服务器的连接,我首先必须定义数据库,然后是架构,然后是 table,这使得以下代码行不起作用:

\copy schema.products TO '/home/localfolder/products.csv' CSV DELIMITER ','

copy (Select * From schema.products) To '/home/localfolder/products.csv' With CSV;

我还尝试了以下 bash 命令:

 psql -d DB -c "select * from schema.products;" > /home/localfolder/products.csv

并使用以下结果记录它:

-bash: home/localfolder/products.csv: No such file or directory

如果有人能对此有所启发,我将不胜感激。

你试过这个吗?我现在没有 psql 来测试它。

echo “COPY (SELECT * from schema.products) TO STDOUT with CSV HEADER” | psql -o '/home/localfolder/products.csv'

详情:

-o filename   Put  all  output into file filename.  The path must be writable by the client.
echo builtin + piping (|) pass command to psql

来自http://www.postgresql.org/docs/current/static/sql-copy.html

Files named in a COPY command are read or written directly by the server, not by the client application.

因此,您将始终希望使用 psql's \copy 元命令。

以下应该可以解决问题:

\copy (SELECT * FROM schema.products) to 'products.csv' with csv

如果上述方法不起作用,我们需要一个 error/warning 消息来处理。

您提到服务器是远程的,但是您正在连接到本地主机。添加 -h [server here] 或设置 ENV 变量

export PGHOST='[server here]' 

数据库名称应该是最后一个参数,而不是 -d。 最后那个命令应该没有失败,我猜是那个目录不存在。创建它或尝试写入 tmp。

我会请您尝试以下命令:

psql -h [server here] -c "copy (select * from schema.products) to STDOUT csv header" DB > /tmp/products.csv

一段时间后,一位好同事设计了这个解决方案,非常适合我的需要,希望这可以帮助别人。

'ssh -l user [remote host] -p [port] \'psql -c "copy (select * from schema.table_name') to STDOUT csv header" -d DB\' > /home/localfolder/products.csv'

与idobr的回答非常相似。