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.
以下应该可以解决问题:
\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的回答非常相似。
我已经阅读了所有其他解决方案并且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.
以下应该可以解决问题:
\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的回答非常相似。