如何将表格导出为带有PostgreSQL标题的CSV文件?


418

我正在尝试通过命令行将带有标题的PostgreSQL表导出到CSV文件,但是我将其导出到CSV文件,但是没有标题。

我的代码如下:

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

您是否使用的Postgres> = 8.1?
Dana the Sane

1
我想我会计划升级到新版本,让生活变得更加轻松
Elitmiar

Answers:


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

手册所述


7
请注意,直到8.1才引入HEADER参数。
Dana the Sane

7
可以说,这有点生锈。
Milen A. Radev

65
注意COPY需要管理员权限。\COPY如果遇到问题,请改用。
fny 2014年

5
这会给您不合格的输出,最好使用“ FORMAT csv”而不是“ DELIMITER','”。不知道是什么版本
grahamrhay

37
对于v9.5,命令现在为COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal,2016年

223

从psql命令行:

\COPY my_table TO 'filename' CSV HEADER

最后没有分号。


22
该版本是迄今为止最好的版本,因为该COPY命令需要管理员访问权限
Matthew O'Riordan 2012年

2
同样,使用这种psql方法,可以将输出保存在任何人可以访问的地方。我只是使用该psql方法将数据从远程服务器获取到本地文件中。非常光滑
伊恩·高

更好,尤其是保存到您可以访问但postgres用户没有访问权限的目录中时。
史蒂夫·本内特

2
@arilwan使用pg_dump -h remote | pg_restore -h localhost
伊恩·高

4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
尤哈Palomäki

122

除了表名,您还可以编写查询以仅获取选定的列数据。

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;

我不认为您在命令(\COPY ...)的psql版本中需要终止分号。至少在我的psql版本(9.5.2)中,我不需要指定'DELIMITER';默认为逗号。
user1071847'9

如果我将CSV复制到选定字段的表中,语法将如何变化
user269867 '17

99

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

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

7
最适合“任何环境”。最适合1.不需要Postgresql或客户端的特殊权限;2.可以使用相对路径;和3是安全的真正的CSV格式(安全报价)。
彼得·克劳斯

34

这有效

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

10
真好 请注意,这似乎并未使包含逗号的字段内的逗号转义。
RecursivelyIronic

我喜欢这样,不使用-F ,,并|用作分隔符。谢谢!
dsummersl

2
这不是通常被认为是导出功能的东西,只是受控的数据显示。所不同的是轻,但重要的是:这是更打算由人比读COPY这将创建一个文件被重复使用的语句
罗曼摹

7
危险不适用于CSV格式,不适用于带有“,”的数组或文本。使用@Brian的答案。
彼得·克劳斯

8

对于9.5版,我将使用以下格式:

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

7

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

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

4

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

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

仅在PostgreSQL 12+版本中有效
Dirk

3

这是我如何使用pgsl连接到Heroku PG数据库来使其正常工作的外壳:

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

然后将数据转储到CSV文件中:

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

我使用〜作为分隔符,因为我不喜欢CSV文件,我通常使用TSV文件,但是它不允许我添加'\ t'作为分隔符,所以我使用因为它是很少使用的characeter。


0

复制(anysql查询datawanttoexport)到'fileablsoutepathwihname'分隔符','csv标头;

使用此功能,您还可以导出数据。


0

我发布此答案是因为此处给出的其他答案均对我没有实际作用。我无法COPY在Postgres中使用,因为我没有正确的权限。因此,我选择“导出网格行”并将输出保存为UTF-8。

psql@Brian给出的版本也对我不起作用,原因有所不同。它不起作用的原因是,显然Windows命令提示符(我正在使用Windows)独自干预了编码。我不断收到此错误:

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

我最终使用的解决方案是编写一个简短的JDBC脚本(Java),该脚本读取CSV文件并直接将插入语句发布到我的Postgres表中。这可以工作,但是如果不更改编码,命令提示符也可以工作。


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.