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

How to export a PostgreSQL query output to a csv file

我在将我的 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;

然后我在数据库 dbname 中的 shell 中输入了以下命令。

\i script.sql

输出为:

COPY 162

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

因此我的输出 table 的 162 行已被复制到 shell 中。如何将它们粘贴或移动到 csv 文件?

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

现代语法:

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

So the 162 rows of my output table have been copied in the shell. How can I paste or move them to a csv file?

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

The default is a tab character in text format, a comma in CSV format

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

参见:

  • Export specific rows from a PostgreSQL table as INSERT SQL script
  • PostgreSQL: export resulting data from SQL query to Excel/CSV

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

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

有点离题了,还有另一种方法。

我在 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 选项。它抑制了数据的空白填充。

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

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

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

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

之前的大部分答案都是正确的,这里有更多详细信息,仅适用于 linux

1.Create 类似 my_query.sql

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

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

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

提示:小心你的可用磁盘 space 如果你从 your_table 执行 select * 你可能 运行 出 space ] 如果有大 table.