ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我的代码如下所示:

COPY products_273 to '/tmp/products_199.csv' delimiters',';
您使用的是 postgres >= 8.1 吗?
我想我会制定一个升级到更新版本的计划,这会让生活变得更轻松

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

manual 中所述。


请注意,直到 8.1 才引入 HEADER 参数。
可以说,这有点生锈。
注意 COPY 需要管理员权限。如果遇到问题,请改用 \COPY
这会给你不合格的输出,最好使用“FORMAT csv”而不是“DELIMITER ','”。虽然不确定是什么版本
对于 v9.5,命令现在是 COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
A
Arturo Herrero

从 psql 命令行:

\COPY my_table TO 'filename' CSV HEADER

末尾没有分号。


这个版本是迄今为止最好的,因为 COPY 命令需要管理员访问权限
同样使用 psql 方法,可以将输出保存在可以访问的任何位置。我只是使用 psql 方法将数据从远程服务器获取到本地文件中。非常光滑。
好多了,尤其是在保存到您可以访问但 postgres 用户没有访问权限的目录时。
@arilwan 使用 pg_dump -h remote | pg_restore -h localhost
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
D
Dhruvil Thaker

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

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;

我认为您不需要 psql 版本的命令 (\COPY ...) 中的终止分号。至少在我的 psql 版本(9.5.2)中,我不需要指定“DELIMITER”;默认值为逗号。
如果我从 CSV 复制到选定字段的表,语法将如何变化
B
Brian

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

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

最适合“任何环境”。最适合 1. 在 Postgresql 或客户端不需要特殊权限; 2.可以使用相对路径; 3. 对于真正的 CSV 格式(安全报价)是安全的。
我喜欢这个,因为它具有奇异性。
M
Mark Hall

这有效

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

好的。请注意,这似乎不会在包含逗号的字段中转义逗号。
我喜欢这样,没有 -F ,,并使用 | 作为分隔符。谢谢!
这不是通常认为的导出功能,只是受控数据显示。区别很轻微,但很重要:与创建要重用的文件的 COPY 语句相比,这更适合人类阅读
危险 它不适用于 CSV 格式,不适用于带有 "," .. 的数组或文本,不能正确引用 CSV。使用@Brian 的答案。
我喜欢这种形式,因为如果您从命令文件重定向输入,它就可以工作。我使用制表符分隔符,以便例如 gnumeric out.tsv 起作用。
M
Maytham Fahmi

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

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

Y
Yan Foto

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

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

我在哪里可以在我的电脑上找到该目录?
结果保存在 > 之后的任何路径下。
我看不到我的版本的 --csv 选项:psql (PostgreSQL) 11.7 (Ubuntu 11.7-0ubuntu0.19.10.1)
寻呼机等待 cmdline 输入终止时遇到问题。我必须添加 -P pager=off
A
Atihska

该解决方案使用 \copy 对我有用。

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

H
Horse O'Houlihan

下面是我如何使用 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' 作为分隔符,所以我使用 ~ 因为它是一个很少使用的字符。


A
A. Rick

COPY 命令不受限制。受到限制的是将输出从 TO 定向到除 STDOUT 之外的任何地方。但是,通过 \o 命令指定输出文件没有任何限制。

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

u
user3767321

复制(anysql 查询 datawanttoexport)到 'fileablsoutepathwihname' delimiter ',' csv header;

使用这个你也可以导出数据。


T
Tim Biegeleisen

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

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

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

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


M
Mohit Singh

试试这个:“复制 products_273 FROM '\tmp\products_199.csv'DELIMITER ',' CSV HEADER”


V
VSO

pgAdmin 中,像使用 F5 执行并按 F9 一样突出显示您的查询语句 - 这将打开文件浏览器,以便您选择保存 CSV 的位置。

如果您使用的是 Azure Data Studio,请参阅此处的说明:Azure Data Studio: Save As CSV

我知道这不是一个通用的解决方案,但大多数时候你只想手动抓取文件。