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

时间:2015-03-03 20:02:13

标签: bash postgresql csv remote-server

我已经阅读了所有其他解决方案,没有一个能够满足我的需求,我没有使用Java,我没有超级用户权限,我没有在我的服务器上安装API。

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

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

\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:没有这样的文件或目录

我真的很感激,如果有人能够对此有所了解。

4 个答案:

答案 0 :(得分:7)

你试过这个吗?我现在没有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

答案 1 :(得分:0)

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

  

COPY命令中命名的文件由服务器直接读取或写入,而不是由客户端应用程序读取。

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

以下应该可以解决问题:

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

如果上述方法无效,我们需要提供错误/警告信息。

答案 2 :(得分:0)

您提到服务器是远程服务器,但是您要连接到localhost。添加-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

答案 3 :(得分:0)

有一段时间,一位优秀的同事提出了这个完全符合我需求的解决方案,希望这可以帮助别人。

'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的答案。