回答

收藏

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

技术问答 技术问答 119 人阅读 | 0 人回复 | 2023-09-13

将PL / pgSQL输出从PostgreSQL保存数据库CSV文件最简单的方法是什么?
8 `5 U0 m1 H7 M3 S( x" X6 q我正在将PostgreSQL 8.4与pgAdmin III和PSQL一起使用插件,运行查询。
) l, e0 \- N, B- ~# A: y3 N% F                                                                " }  s" Z9 {- N9 A3 r5 U
    解决方案:                                                                  V4 e6 Z  V3 I- H
                                                                您是想在服务器上还是在客户端上生成结果文件?/ s6 J5 V$ H$ h7 t" ?6 G
服务器端如果你想要一些容易重用或自动化的东西,可以使用Postgresql的内置COPY命令。例如8 l1 I  O; @$ l2 b; y: p
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;这种方法完全在远程服务器上运行    -本地写不出来PC。它也需要以Postgres超级用户(通常称为
' D% O7 r' Y/ v5 ]3 Troot因为Postgres它不能阻止它使用计算机的本地文件系统来执行令人讨厌的事情。; |' a4 }# F9 v* T, [& ~
这并不意味着你必须作为超级用户连接(自动连接会带来另一种安全风险),因为你可以使用它SECURITYDEFINER选项CREATEFUNCTION来使功能 像超级用户一样运行    。
+ @# v2 r( p- X& f# R* @4 }1 k关键部分是你的函数可以进行其他检查,而不仅仅是绕过安全-, G3 X/ f1 [# [& f+ y0 n
因此,只要能满足严格的白名单,您就可以编写函数导出所需的确切数据,或编写可以接受各种选项的东西。您需要检查两件事:+ O: k3 s- s0 b* x6 L# z/ t* q3 L
[ol]用户应该在磁盘上阅读/写入哪些 文件    ?例如,这可能是一个特定的目录,文件名必须有合适的前缀或扩展名。7 h6 x& D7 G( p6 i
用户应该能够在数据库中读取/写入哪些     这通常是由的GRANT数据库中的s定义,但该函数现在作为超级用户运行,因此通常可以完全访问超出范围的表。您可能不希望有人调用您的函数并在您的表格结尾添加行。[/ol]我写了一篇关于这种方法的博客文章,包括一些导出(或导入)满足严格条件的文件和表函数的示例。9 w# D* h+ |# q! C! v5 \
客户端另一种方法是 在客户端    (即在您的应用程序或脚本中) 处理文件" ]# _2 d+ f5 D) t* [- x
。Postgres服务器不需要知道要复制哪个文件,只需要吐出数据,然后客户端就可以把它放在某个位置。. U- m8 N: d+ x# T' ]) ?8 k+ [
该COPY TO STDOUT命令的基本语法是命令,pgAdmin这种图形工具将在一个漂亮的对话框中为您包装。
$ |1 v) [# J4 B! T, p+ l4 D0 `psql 命令行客户端有一为元命令\copy    ,这需要所有相同的选项,“真正的”; ~0 Y1 A' H9 O9 J# Y# x2 {
COPY,但在运营客户端:
, N5 u* \; ^+ A( z$ R\copy (Select * From foo) To '/tmp/test.csv' With CSV请注意,没有终止,因为和,SQL命令不同,元命令由换行符终止。# f3 v) |! E; g1 ^
从文档:5 e. {$ `6 a8 x
请勿将COPY与psql指令\ copy混淆。\ copy调用COPY FROM STDIN或COPY TO& |. N1 F& s" u9 [& N
STDOUT,然后提取/存储数据psql客户端可访问的文件中。因此,使用\ copy文件的可访问性和访问权限取决于客户端而不是服务器。/ c2 K( z* B' V* v8 w0 _
您的应用程序编程语言 可能    还支持推送或获取数据,但通常不是标准的,因为它不能连接输入/输出流SQL语句中使用COPY FROM STDIN/
% M; D3 F) C6 N" @3 H  kTO STDOUT。PHP的PostgreSQL处理程序( 不是
5 s7 w( K$ ]( D( hPDO)包括非常基本的功能pg_copy_from和可与pg_copy_toPHP复制数组的功能对大型数据集可能无效。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则