如何在Postgresql上将表格导出为带有标题的CSV?

如何在Postgresql上将表格导出为带有标题的CSV?,postgresql,csv,export-to-csv,heading,postgresql-copy,Postgresql,Csv,Export To Csv,Heading,Postgresql Copy,我试图通过命令行将带有标题的PostgreSQL表导出到CSV文件,但是我让它导出到CSV文件,但没有标题 我的代码如下所示: COPY products_273 to '/tmp/products_199.csv' delimiters','; 如。中所述,此操作有效 psql dbname -F , --no-align -c "SELECT * FROM TABLE" 从psql命令行: \COPY my_table TO 'filename' CSV HEADER 末尾没有分号。您

我试图通过命令行将带有标题的PostgreSQL表导出到CSV文件,但是我让它导出到CSV文件,但没有标题

我的代码如下所示:

COPY products_273 to '/tmp/products_199.csv' delimiters',';
如。

中所述,此操作有效

psql dbname -F , --no-align -c "SELECT * FROM TABLE"

从psql命令行:

\COPY my_table TO 'filename' CSV HEADER

末尾没有分号。

您还可以编写一个查询,只获取选定的列数据,而不仅仅是表名

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
具有管理员权限

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
复制(anysql查询数据WantoExport)到“FileAblSoutePathName”分隔符、“csv标头”


使用此u还可以导出数据。

以下是我如何使用pgsl连接到Heroku PG数据库使其在power shell中工作的:

我必须首先将客户端编码更改为utf8,如下所示:
\encoding utf8

然后将数据转储到CSV文件,如下所示:

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

我使用~作为分隔符,因为我不喜欢CSV文件,我通常使用TSV文件,但它不允许我添加“\t”作为分隔符,所以我使用~,因为它是一个很少使用的字符

当我没有权限从Postgres中写入文件时,我发现我可以从命令行运行查询

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

对于我使用的9.5版,它将如下所示:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

使用
\copy
这个解决方案对我有效

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
psql-h-U-d-c“\copy FROM'',格式为(csv,header true,delimiter',”)

我之所以发布这个答案,是因为这里给出的其他答案都不适合我。我无法在Postgres中使用
复制
,因为我没有正确的权限。所以我选择了“导出网格行”,并将输出保存为UTF-8

@Brian给出的
psql
版本也不适合我,原因不同。它不起作用的原因显然是Windows命令提示符(我使用的是Windows)自己在干预编码。我不断地得到这个错误:

错误:编码“WIN1252”中字节序列为0x81的字符在编码“UTF8”中没有等效字符

我最终使用的解决方案是编写一个简短的JDBC脚本(Java),它读取CSV文件并直接向我的Postgres表中发出insert语句。这是可行的,但如果没有更改编码,命令提示符也会起作用。

最简单的方法(使用)似乎是使用
--csv
标志:

psql--csv-c“从产品中选择*”>“/tmp/products_199.csv”
试试这个: “从“\tmp\products\u 199.csv”分隔符、“csv头”复制产品\u 273

复制命令不受限制。限制的是将输出从引导到标准输出以外的任何位置。但是,通过\o命令指定输出文件没有限制

\o '/tmp/products_199.csv';
COPY products_273 TO STDOUT WITH (FORMAT CSV, HEADER);


请注意,HEADER参数是在8.1之前引入的。这有点过时。注意
COPY
需要管理员权限。如果遇到问题,请改用
\COPY
。这样会产生不一致的输出,最好使用“格式化csv”而不是“分隔符”。不确定到达的版本对于v9.5,命令现在是
COPY products_273到'/tmp/products_199.csv',格式为(csv,HEADER)
您使用的是postgres>=8.1吗?我想我会制定一个升级到新版本的计划,这将使生活更加轻松。此外,这个版本是迄今为止最好的,因为
COPY
命令需要管理员访问权限。同样,使用
psql
方法,您可以将输出保存到任何可以访问的地方。我只是使用了
psql
方法将数据从远程服务器获取到本地文件中。非常流畅。更好,尤其是当保存到您可以访问但postgres用户不能访问的目录时。@arilwan使用
pg_dump-h remote | pg_restore-h localhost
@arilwan
psql-c”\COPY(从mytable中选择*FROM)到STDOUT>mytable.csv
Nice。请注意,这似乎不会在包含逗号的字段中转义逗号。我喜欢这样,不使用
-F、
,并使用
|
作为分隔符。谢谢这不是通常认为的导出功能,只是受控数据显示。区别很小,但很重要:这比创建要重用的文件的
COPY
语句更适合人类阅读,因为它不适用于CSV格式,也不适用于带有“,”的数组或文本。。不做正确的CSV报价。使用@Brian的答案。我喜欢这个表单,因为如果您重定向来自命令文件的输入,它可以工作。我使用了一个制表符分隔符,例如,
gnumeric out.tsv
可以工作。我认为在命令的psql版本中不需要终止分号(
\COPY…
)。至少在我的psql版本(9.5.2)中,我不需要指定“分隔符”;默认值是逗号。如果我将选定字段的CSV复制到表中,语法将如何更改最适合“任何环境”。最适合一个人。在Postgresql或客户端不需要特殊权限;2.可以使用相对路径;三,。对于真正的CSV格式(安全引用)是安全的。我喜欢这个,因为它可以与sigularity一起工作。我在我的电脑上哪里可以找到该目录?结果保存在
之后的任何路径下。我的版本没有
--CSV
选项:
psql(PostgreSQL)11.7(Ubuntu 11.7-0ubuntu0.19.10.1)
\o '/tmp/products_199.csv';
COPY products_273 TO STDOUT WITH (FORMAT CSV, HEADER);