从PostgreSQL数据库保存PL/pgSQL输出到CSV文件的最简单的方法是什么?

我使用PostgreSQL 8.4 pgAdmin III和PSQL插件,我从那里运行查询。


当前回答

在终端(当连接到db时)将输出设置为cvs文件

1)设置字段分隔符为',':

\f ','

2)设置输出格式不对齐:

\a

3)只显示元组:

\t

4)设定输出:

\o '/tmp/yourOutputFile.csv'

5)执行查询:

:select * from YOUR_TABLE

6)输出:

\o

然后,您将能够在这个位置找到您的csv文件:

cd /tmp

使用scp命令复制或使用nano编辑:

nano /tmp/yourOutputFile.csv

其他回答

新版本- psql 12 -将支持——csv。

PSQL - devel ——csv 切换到CSV(逗号分隔值)输出模式。这相当于\pset格式的csv。 csv_fieldsep 指定在CSV输出格式中使用的字段分隔符。如果分隔符出现在字段的值中,该字段将以双引号输出,遵循标准CSV规则。默认值是逗号。

用法:

psql -c "SELECT * FROM pg_catalog.pg_tables" --csv  postgres

psql -c "SELECT * FROM pg_catalog.pg_tables" --csv -P csv_fieldsep='^'  postgres

psql -c "SELECT * FROM pg_catalog.pg_tables" --csv  postgres > output.csv

在终端(当连接到db时)将输出设置为cvs文件

1)设置字段分隔符为',':

\f ','

2)设置输出格式不对齐:

\a

3)只显示元组:

\t

4)设定输出:

\o '/tmp/yourOutputFile.csv'

5)执行查询:

:select * from YOUR_TABLE

6)输出:

\o

然后,您将能够在这个位置找到您的csv文件:

cd /tmp

使用scp命令复制或使用nano编辑:

nano /tmp/yourOutputFile.csv

CSV统一导出

这个信息并没有很好地表示出来。因为这是我第二次需要推导这个,我把它写在这里提醒自己。

实际上,最好的方法(从postgres中获取CSV)是使用COPY…到STDOUT命令。虽然你不想用答案中显示的方式来做。该命令的正确使用方法为:

COPY (select id, name from groups) TO STDOUT WITH CSV HEADER

只记住一个命令!

它非常适合在ssh上使用:

$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv

它非常适合在docker中使用ssh:

$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv

它甚至在本地机器上也很棒:

$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv

或本地机器上的内部docker ?:

docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv

或者在kubernetes集群上,在docker中,通过HTTPS??:

kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv

多才多艺,有很多逗号!

你知道吗?

是的,我写了,以下是我的笔记:

的份

使用/copy可以作为执行it1的用户在psql命令运行的任何系统上有效地执行文件操作。如果连接到远程服务器,那么将执行psql的系统上的数据文件复制到远程服务器或从远程服务器复制数据文件是很简单的。

COPY作为后端进程用户帐户(默认为postgres)在服务器上执行文件操作,检查并相应应用文件路径和权限。如果使用TO STDOUT,则绕过文件权限检查。

如果psql没有在您希望生成的CSV最终驻留的系统上执行,这两个选项都需要后续的文件移动。根据我的经验,当您主要使用远程服务器时,这是最可能的情况。

通过ssh配置TCP/IP隧道之类的东西到远程系统以获得简单的CSV输出会更复杂,但对于其他输出格式(二进制),最好通过隧道连接/copy,执行本地psql。同样,对于大型导入,将源文件移动到服务器并使用COPY可能是性能最高的选项。

PSQL参数

使用psql参数,你可以像CSV一样格式化输出,但也有缺点,比如必须记住禁用分页器和不获取头信息:

$ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
2,Technician,Test 2,,,t,,0,,                                                                                                                                                                   
3,Truck,1,2017-10-02,,t,,0,,                                                                                                                                                                   
4,Truck,2,2017-10-02,,t,,0,,

其他工具

不,我只是想在不编译和/或安装工具的情况下从服务器中获取CSV。

我不得不使用\COPY,因为我收到了错误消息:

ERROR:  could not open file "/filepath/places.csv" for writing: Permission denied

所以我用了:

\Copy (Select address, zip  From manjadata) To '/filepath/places.csv' With CSV;

它在运作

在pgAdmin III中,有一个从查询窗口导出到文件的选项。在主菜单中,它是Query -> Execute to file或者有一个按钮做同样的事情(它是一个带有蓝色软盘的绿色三角形,而不是仅仅运行查询的普通绿色三角形)。如果您没有从查询窗口运行查询,那么我将按照IMSoP的建议使用复制命令。