从PostgreSQL数据库保存PL/pgSQL输出到CSV文件的最简单的方法是什么?
我使用PostgreSQL 8.4 pgAdmin III和PSQL插件,我从那里运行查询。
从PostgreSQL数据库保存PL/pgSQL输出到CSV文件的最简单的方法是什么?
我使用PostgreSQL 8.4 pgAdmin III和PSQL插件,我从那里运行查询。
当前回答
我不得不使用\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;
它在运作
其他回答
import json
cursor = conn.cursor()
qry = """ SELECT details FROM test_csvfile """
cursor.execute(qry)
rows = cursor.fetchall()
value = json.dumps(rows)
with open("/home/asha/Desktop/Income_output.json","w+") as f:
f.write(value)
print 'Saved to File Successfully'
JackDB是web浏览器中的一个数据库客户端,它让这一切变得非常简单。特别是如果你在Heroku。
它允许您连接到远程数据库并在其上运行SQL查询。
源 (来源:jackdb.com)
一旦连接了数据库,就可以运行查询并导出到CSV或TXT(见右下角)。
注:我与JackDB没有任何关联。我目前使用他们的免费服务,认为这是一个很棒的产品。
PSQL可以帮你做到这一点:
edd@ron:~$ psql -d beancounter -t -A -F"," \
-c "select date, symbol, day_close " \
"from stockprices where symbol like 'I%' " \
"and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$
有关此处使用的选项的帮助,请参阅man psql。
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。
应@skeller88的要求,我将我的评论作为一个答案重新发布,这样就不会被那些没有阅读每个回复的人所遗漏……
DataGrip的问题在于它控制了你的钱包。它不是免费的。在DBeaver .io上试试社区版的DBeaver。它是一个面向SQL程序员、dba和分析师的自由/开源多平台数据库工具,支持所有流行的数据库:MySQL、PostgreSQL、SQLite、Oracle、DB2、SQL Server、Sybase、MS Access、Teradata、Firebird、Hive、Presto等。
DBeaver Community Edition使得连接到数据库、发出查询以检索数据、然后下载结果集以将其保存为CSV、JSON、SQL或其他常见数据格式变得非常简单。对于Postgres的TOAD, SQL Server的TOAD,或者Oracle的TOAD,它是一个可行的自由/开源软件竞争对手。
I have no affiliation with DBeaver. I love the price and functionality, but I wish they would open up the DBeaver/Eclipse application more and made it easy to add analytics widgets to DBeaver / Eclipse, rather than requiring users to pay for the annual subscription to create graphs and charts directly within the application. My Java coding skills are rusty and I don't feel like taking weeks to relearn how to build Eclipse widgets, only to find that DBeaver has disabled the ability to add third-party widgets to the DBeaver Community Edition.
DBeaver用户是否了解如何创建要添加到社区版的分析小部件?