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

flseospp  于 2023-04-11  发布在  PostgreSQL
关注(0)|答案(4)|浏览(188)

我在将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文件中呢?
或者,如果我要使用文件名.csv(截图附后),我如何修复该csv/Excel文件的格式?

frebpwbc

frebpwbc1#

现代语法:

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

所以我的输出表的162行已经被复制到shell中了。我如何将它们粘贴或移动到csv文件中呢?
结果***是*CSV文件。使用任何电子表格程序使用匹配的分隔符打开它。The manual:
默认值为文本格式的制表符和CSV格式的逗号
psql meta命令
\copy**是对SQL COPY函数的 Package 。它写入和读取客户端本地的文件(而COPY使用服务器本地的文件),并且不需要超级用户权限。
参见:

isr3a4wc

isr3a4wc2#

大多数previos的答案是正确的,这里有更多的细节,只适用于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中选择 *,如果你有一个大表,你可能会用完空间。

qojgxg4l

qojgxg4l3#

首先将连接信息复制到~/.pgpass中,然后

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

slwdgvem4#

稍微偏离一点,还有另一种方法。
我在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的帐户与运行我的调度批处理文件的帐户没有相同的权限。
这会得到一个给定模式中的表列表,结果如下:
我的模式|mytable1
我的模式|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

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

相关问题