如何将 PostgreSQL 查询输出导出到 csv 文件

问题描述 投票:0回答:4

我在将我的 PostgreSQL 输出从 shell 导出到 csv 文件时遇到问题。
我的 SQL 脚本称为

script.sql
.

我在 shell 中输入了以下命令:

psql congress -af script.sql &> filename.csv

但是当我打开

filename.csv
文件时,所有列的值都被压缩在Excel csv中的一列中(见附件截图)。

然后我尝试了另一种方式。我将我的

script.sql
编辑为:

Copy (Select * From ...) To '/tmp/filename.csv' With CSV;

然后我在数据库中的 shell 中键入以下命令

dbname
.

\i script.sql

输出为:

COPY 162

嗯,我的输出查询有 162 行。

所以我的输出表的162行已经复制到shell中了。如何将它们粘贴或移动到 csv 文件?

或者,如果我要使用 filename.csv(附上截图),我该如何修复该 csv/Excel 文件的格式?

Screenshot of filename.csv

postgresql shell csv export-to-excel export-to-csv
4个回答
59
投票

现代语法:

COPY (SELECT * FROM ...) TO '/tmp/filename.csv' (FORMAT csv);

所以我的输出表的162行已经复制到shell中了。如何 我可以将它们粘贴或移动到 csv 文件吗?

结果 CSV文件。使用任何使用匹配分隔符的电子表格程序打开它。 说明书:

文本格式默认为制表符,CSV格式默认为逗号

psql 元命令

\copy
是 SQL
COPY
函数的包装器。它写入和读取客户端本地文件(而
COPY
使用服务器本地文件)并且不需要超级用户权限。

参见:


8
投票

大多数以前的答案都是正确的,这里有更多细节并且只适用于 linux

1.创建一个类似my_query.sql的文件

\COPY (select * from some_table) TO '/tmp/some_file.csv' (format CSV);

2.更新数据库和文件路径的变量后,运行以下命令。

psql "host=YOUR_HOST port=YOUR_PORT dbname=YOUR_DB user=YOUR_USER password=YOUR_PASS" -af my_query.sql

提示:请注意您可用的可用磁盘空间,如果您执行 select * from your_table 如果表很大,则可能会用完空间。


2
投票

首先将您的连接信息复制到 ~/.pgpass 和

cat ip:port:dbname:user:pass > ~/.pgpass
chmod 0600 ~/.pgpass
psql -h serverip -U userid dbname -af test.sql | gzip > result.txt.gz

1
投票

有点切线,还有另一种方式。

我在 Windows 批处理脚本中使用以下内容:-

psql.exe -U %cUser% -h %cHost% -p %cPort% -d %cDB% -t -o "%dumpDir%\tables.txt" -A -c "SELECT table_schema, table_name   FROM information_schema.tables WHERE table_schema = '%qSchema%';"

诀窍是记住 -A 选项。它抑制了数据的空白填充。

我这样做是为了避免上面显示的 COPY 命令的权限错误,运行 postgress 的帐户与运行我的计划批处理文件的帐户没有相同的权限。

这为我提供了给定模式中的表列表,结果如下:-

myschema|mytable1

myschema|mytable2

然后我使用 FOR 批处理命令来处理每一行。如果你真的想要一个 CSV 文件,你需要做的就是:-

ECHO table_schema,table_name > %dumpDir%\tables.csv
FOR /F "delims=|" %%p in (%dumpDir%\tables.txt) DO echo %%p,%%q >> %dumpDir%\tables.csv

可能不是最有效的机制,但在少量输出行上工作良好。

© www.soinside.com 2019 - 2024. All rights reserved.