将远程Postgres表导出为本地计算机上的CSV文件


16

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

COPY products TO '/tmp/products.csv' DELIMITER ',';

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

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

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

Answers:


29

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

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

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

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

有关详细信息,请参见手册中\copy条目以获取psql命令COPY命令文档

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


在某些有限的情况下可能有用的通常较差的替代方法是使用:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

并使用-o标志或外壳程序输出重定向将输出写入文件。您几乎应该总是\copy优先使用此功能。


但是,这不允许进行交易:(
Reza S

嗯,可以。使用here-document来提供psql脚本,以开头BEGIN,然后执行\copy命令,然后是COMMIT。或者使用psql -f运行脚本而不是使用here-document。
Craig Ringer 2015年

感谢您回来...这就是我最终要完成的工作,它奏效了=)
Reza S

您可以使用-A代替,-P format=unaligned我也认为您需要-P fieldsep=,
Evan Carroll

2

Linux命令是:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'

1
那不会产生CSV,它将产生格式化的文本输出。如果您添加-t -P format=unaligned 到该命令,则会得到更接近的信息,例如错误的以竖线分隔的CSV,但是文本中的竖线不会被转义,因此将是无效的。
克雷格·林格2013年

哦,您还想要,-P fieldsep=','只是由于缺少转义,这更有可能导致错误。-P fieldsep_zero=on如果您不介意解析以空字节分隔的文本,那将是可以的,因为空字节psql自然不会出现在输出中。
Craig Ringer 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.