将PostgreSQL的PL / pgSQL输出保存为CSV文件
将PL / pgSQL输出从PostgreSQL数据库保存到CSV文件的最简单方法是什么?
我使用PostgreSQL 8.4与pgAdmin III和PSQL插件在哪里运行查询。
你想在服务器上还是在客户端上生成结果文件?
服务器端
如果你想要一些易于重用或自动化的东西,你可以使用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
的特殊“元命令”,它采用与“真正” COPY
相同的选项,但在客户端中运行:
copy (Select * From foo) To '/tmp/test.csv' With CSV
请注意,没有终止;
,因为与SQL命令不同,元命令由换行符终止。
从文档:
不要将COPY与psql指令复制混淆。 copy从STDIN复制或复制到STDOUT,然后将数据提取/存储在psql客户端可访问的文件中。 因此,使用 copy时,文件可访问性和访问权限取决于客户端而不是服务器。
您的应用程序编程语言也可能支持推送或提取数据,但通常不能在标准SQL语句中使用COPY FROM STDIN
/ TO STDOUT
,因为无法连接输入/输出流。 PHP的PostgreSQL处理程序(不是PDO)包含非常基本的pg_copy_from
和pg_copy_to
函数,它们可以复制到PHP数组中,或从PHP数组中复制,这对于大型数据集可能不是有效的。
有几种解决方案:
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但这不是脚本。
在终端(当连接到数据库)设置输出到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
链接地址: http://www.djcxy.com/p/55083.html