Answers:
已经建议的两种方法似乎都不必要地复杂。
只需使用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
优先使用此功能。
psql
脚本,以开头BEGIN
,然后执行\copy
命令,然后是COMMIT
。或者使用psql -f
运行脚本而不是使用here-document。
-A
代替,-P format=unaligned
我也认为您需要-P fieldsep=,
Linux命令是:
psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'
-t -P format=unaligned
到该命令,则会得到更接近的信息,例如错误的以竖线分隔的CSV,但是文本中的竖线不会被转义,因此将是无效的。
-P fieldsep=','
只是由于缺少转义,这更有可能导致错误。-P fieldsep_zero=on
如果您不介意解析以空字节分隔的文本,那将是可以的,因为空字节psql
自然不会出现在输出中。