【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
将PL / pgSQL输出从PostgreSQL数据库保存到CSV文件的最简单方法是什么?
我将PostgreSQL 8.4与pgAdmin III和PSQL插件一起使用,从中运行查询。
#1楼
在终端中(连接到数据库时)将输出设置为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
#2楼
有几种解决方案:
1个psql
命令
psql -d dbname -t -A -F"," -c "select * from users" > output.csv
这具有很大的优势,您可以通过SSH使用它,例如ssh postgres@host command
-使您能够
2 postgres copy
命令
COPY (SELECT * from users) To '/tmp/output.csv' With CSV;
3 psql交互式(或不)
>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q
所有这些都可以在脚本中使用,但我更喜欢#1。
4 pgadmin,但这不是脚本。
#3楼
如果您对特定表的所有列以及标题感兴趣,可以使用
COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
这比简单一点
COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
就我所知,这是等效的。
#4楼
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
。
#5楼
您要在服务器还是客户端上生成结果文件?
服务器端
如果您想要易于重用或自动化的东西,可以使用Postgresql内置的COPY命令。 例如
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',';
这种方法完全在远程服务器上运行 -无法写入本地PC。 它也需要作为Postgres的“超级用户”(通常称为“ root”)运行,因为Postgres不能阻止它使用该计算机的本地文件系统来处理令人讨厌的事情。
这实际上并不意味着您必须以超级用户身份进行连接(自动进行连接会带来另一种类型的安全风险),因为您可以使用SECURITY DEFINER
选项来CREATE FUNCTION
来使功能像您自己一样运行。超级用户 。
关键部分是您的函数可以执行其他检查,而不仅仅是绕过安全性-因此您可以编写一个函数,以导出所需的确切数据,或者编写可以接受各种选项的东西,只要它们可以符合严格的白名单。 您需要检查两件事:
- 应该允许用户在磁盘上读取/写入哪些文件 ? 例如,这可能是特定目录,并且文件名可能必须具有合适的前缀或扩展名。
- 用户应该能够在数据库中读取/写入哪些表 ? 这通常由数据库中的
GRANT
定义,但是该函数现在以超级用户身份运行,因此通常可以“超出范围”的表将可以完全访问。 您可能不想让别人调用您的函数并在“用户”表的末尾添加行…
我写了一篇有关此方法的博客文章 ,其中包括一些导出(或导入)满足严格条件的文件和表的函数的示例。
客户端
另一种方法是在客户端 (即在您的应用程序或脚本中) 进行文件处理 。 Postgres服务器不需要知道要复制到哪个文件,它只需吐出数据,然后客户端将其放在某个位置即可。
底层的语法是COPY TO STDOUT
命令,而像pgAdmin这样的图形工具将在一个漂亮的对话框中为您包装它。
psql
命令行客户端有一个特殊的“元命令”,称为\\copy
,它采用与“ real” COPY
相同的所有选项,但在客户端内部运行:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
注意,没有终结符;
,因为元命令以换行符终止,这与SQL命令不同。
从文档 :
请勿将COPY与psql指令\\ copy混淆。 \\ copy调用COPY FROM STDIN或COPY TO STDOUT,然后将数据提取/存储在psql客户端可访问的文件中。 因此,使用\\ copy时,文件的可访问性和访问权限取决于客户端而不是服务器。
您的应用程序编程语言可能还支持推送或获取数据,但是由于无法连接输入/输出流,因此通常不能在标准SQL语句内使用COPY FROM STDIN
/ TO STDOUT
。 PHP的PostgreSQL处理程序( 不是 PDO)包括非常基本的pg_copy_from
和pg_copy_to
函数,它们可以向PHP数组复制或从PHP数组复制,这对于大型数据集可能并不有效。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3144094