我已经阅读了所有其他解决方案,没有一个能够满足我的需求,我没有使用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:没有这样的文件或目录
我真的很感激,如果有人能够对此有所了解。
答案 0 :(得分:7)
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命令中命名的文件由服务器直接读取或写入,而不是由客户端应用程序读取。
以下应该可以解决问题:
\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的答案。