【问题标题】:How to export a PostgreSQL query output to a csv file如何将 PostgreSQL 查询输出导出到 csv 文件
【发布时间】:2015-05-25 06:50:31
【问题描述】:

我在将 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 行。

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

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

【问题讨论】:

标签: postgresql shell csv export-to-excel export-to-csv


【解决方案1】:

现代语法:

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

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

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

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

Patrick commented 一样,您可以以类似的方式使用相应的psql 元命令\copy。它在客户端本地写入(和读取)文件,不需要超级用户权限。

这些相关答案中有更多解释:

【讨论】:

  • COPY 要求您是超级用户。 \copy 可以被普通用户使用,并且似乎具有相同的语法
  • 这会默认忽略输出中的标题吗?
  • @Spike 是的。如果你想要标题,只需使用 (format CSV, HEADER)
【解决方案2】:

大多数之前的答案都是正确的,这里有更多详细信息,仅适用于 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

提示:如果您从 your_table 中选择 *,请注意您的可用磁盘空间,如果有一个大表,您可能会用完空间。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      我在 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
      

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

      【讨论】:

      • 我喜欢psql -c 'select * from table limit 5' -tAF,,它会自动生成csv。
      • 你在哪里使用密码
      猜你喜欢
      • 2020-08-03
      • 2018-09-11
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      相关资源
      最近更新 更多