将PostgreSQL的PL / pgSQL输出保存到CSV文件

好久不见. 提交于 2019-12-17 18:20:20

【推荐】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来使功能像您自己一样运行。超级用户

关键部分是您的函数可以执行其他检查,而不仅仅是绕过安全性-因此您可以编写一个函数,以导出所需的确切数据,或者编写可以接受各种选项的东西,只要它们可以符合严格的白名单。 您需要检查两件事:

  1. 应该允许用户在磁盘上读取/写入哪些文件 ? 例如,这可能是特定目录,并且文件名可能必须具有合适的前缀或扩展名。
  2. 用户应该能够在数据库中读取/写入哪些 ? 这通常由数据库中的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_frompg_copy_to函数,它们可以向PHP数组复制或从PHP数组复制,这对于大型数据集可能并不有效。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!