将PostgreSQL表导出为带有标题的CSV文件

Rol*_*and 398 csv postgresql heading export-to-csv postgresql-copy

我正在尝试通过命令行将带有标题的PostgreSQL表导出到CSV文件,但是我将其导出到CSV文件但没有标题.我也需要那些标题.我的代码如下所示

COPY products_273 to '/tmp/products_199.csv' delimiters',';
Run Code Online (Sandbox Code Playgroud)

Mil*_*dev 575

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Run Code Online (Sandbox Code Playgroud)

如手册中所述.

  • 注意`COPY`需要管理员权限.如果遇到问题,请使用`\ COPY`. (62认同)
  • 对于v9.5,命令现在是`COPY products_273 TO'/tmp/products_199.csv'WITH(FORMAT CSV,HEADER);` (36认同)
  • 请注意,直到8.1才会引入HEADER参数. (7认同)
  • 也就是说,有点生疏了. (5认同)
  • 这可以给你不符合要求的输出,更好地使用"FORMAT csv"而不是"DELIMITER','".不知道到底是什么版本 (4认同)

Lau*_*con 208

从psql命令行:

\COPY my_table TO 'filename' CSV HEADER
Run Code Online (Sandbox Code Playgroud)

最后没有分号.

  • 这个版本是迄今为止最好的,因为`COPY`命令需要管理员访问权限 (22认同)
  • @arilwan`psql -c“ \ COPY(选择*从mytable到标准输出)到标准输出”> mytable.csv` (3认同)
  • 使用`psql`方法,可以将输出保存在可以访问的任何地方.我只是使用`psql`方法将数据从远程服务器获取到本地文件中.非常光滑. (2认同)
  • @arilwan使用`pg_dump -h remote | pg_restore -h localhost`。 (2认同)

Dhr*_*ker 115

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

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

具有管理员权限

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

  • 写它时显示Permission denied错误 (2认同)

小智 93

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

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

  • 最适合"任何环境".最适合**1.**不需要Postgresql或客户端的特殊权限;**2.**可以使用相对路径; 和**3.**对于真正的CSV格式(安全报价)是安全的. (7认同)

小智 33

这有效

psql dbname -F , --no-align -c "SELECT * FROM TABLE"
Run Code Online (Sandbox Code Playgroud)

  • 尼斯.请注意,这似乎不会在包含它们的字段内转义逗号. (9认同)
  • **危险**它不适用于CSV格式,不适用于带有","的数组或文本..不能进行正确的CSV引用.使用@Brian的答案. (7认同)
  • 这不是通常被认为是导出功能,只是受控数据显示.差别很轻,但很重要:这比人们更容易阅读,而不是`COPY`语句,它创建了一个可以重用的文件 (2认同)

may*_*ʎɐɯ 8

对于我使用的版本9.5,它将是这样的:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Run Code Online (Sandbox Code Playgroud)


Yan*_*oto 8

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

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'
Run Code Online (Sandbox Code Playgroud)

  • 我的版本没有看到“--csv”选项:“psql (PostgreSQL) 11.7 (Ubuntu 11.7-0ubuntu0.19.10.1)” (3认同)

Ati*_*ska 6

这个解决方案适合我使用\copy.

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