当前位置: 首页 > 面试题库 >

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

蒋烨然
2023-03-14
问题内容

将PL / pgSQL输出从PostgreSQL数据库保存到CSV文件的最简单方法是什么?

我正在将PostgreSQL 8.4与pgAdmin III和PSQL插件一起使用,从中运行查询。


问题答案:

您要在服务器上还是在客户端上生成结果文件?

如果您想要一些易于重用或自动化的东西,可以使用Postgresql的内置COPY命令。例如

Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;

这种方法完全在远程服务器上运行 -无法写入本地PC。它也需要以Postgres的“超级用户”(通常称为“
root”)运行,因为Postgres不能阻止它使用该计算机的本地文件系统执行令人讨厌的事情。

这实际上并不意味着您必须以超级用户身份进行连接(自动连接将带来另一种类型的安全风险),因为您可以使用该SECURITY DEFINER选项CREATE FUNCTION来使功能 像超级用户一样运行

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

  1. 应该允许用户在磁盘上读取/写入哪些 文件 ?例如,这可能是一个特定的目录,并且文件名可能必须具有合适的前缀或扩展名。
  2. 用户应该能够在数据库中读取/写入哪些 ?这通常由GRANT数据库中的s定义,但是该函数现在以超级用户身份运行,因此通常可以“超出范围”的表将可以完全访问。您可能不想让某人调用您的函数并在您的“表格”末尾添加行。

我写了一篇有关此方法的博客文章,其中包括一些导出(或导入)满足严格条件的文件和表的函数的示例。

客户端

另一种方法是 在客户端 (即在您的应用程序或脚本中) 进行文件处理
。Postgres服务器不需要知道要复制到哪个文件,只需吐出数据,然后客户端将其放在某个位置即可。

COPY TO STDOUT命令的基本语法是命令,而pgAdmin之类的图形工具将在一个漂亮的对话框中为您包装它。

psql 命令行客户端有一个特殊的“元命令”之称 \copy ,这需要所有相同的选项,“真正的”
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_toPHP数组进行复制的功能,这些功能对于大型数据集可能无效。



 类似资料:
  • PostgreSQL PL/pgSQL 调试器能指导你一步一步调试 PL/pgSQL 过程或函数。若要启动调试器,请点击函数设计器内的 “调试”按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 运行 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 逐过程 恢复运行。当前的行将被运行。如果该行是一个过程或函数调用,它会

  • PostgreSQL PL/pgSQL 调试器能指导你一步一步调试 PL/pgSQL 过程或函数。若要启动调试器,请点击函数设计器内的 按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 停止逐步运行代码。运行将停止,并且无法恢复。 恢复运行。当前的行将被运行。如果该行是

  • PostgreSQL PL/pgSQL 调试器能指导你一步一步调试 PL/pgSQL 过程或函数。若要启动调试器,请点击函数设计器内的 “调试” 按钮。 你可以使用工具栏或菜单运行最常用的调试动作: 按钮 描述 运行 开始在调试模式下运行代码。如有需要,输入参数。调试器会运行你的代码直到代码结束或到达下一个断点。键盘快捷键:F9 逐过程 恢复运行。当前的行将被运行。如果该行是一个过程或函数调用,它

  • 问题内容: 我在所有技术术语上都不是很好,所以我会尽力解释我的问题。 我已经编写了一个小脚本来打开android SDK并检查连接的设备(使用Windows 10和python 2.7.14)。我得到的代码如下: 一切正常,但我想将最后3行保存到文本文件中。我尝试过使用并将其全部转换为字符串并将其写入文件并关闭它,但是它不起作用。它甚至都没有创建文件,更不用说向它写入任何内容了。 我可能缺少一些关

  • 在运行将StringBuilder的内容保存到.xlsx文件的代码时,它给出了以下错误: 线程“main”java.lang.nosuchmethoderror:org.apache.poi.util.poilogger.log(iljava/lang/object;ljava/lang/throwable;)V在org.apache.poi.openxml4j.opc.zippackage.bu

  • 问题内容: 如何将URL输出的JSON保存到文件中? 例如,来自Twitter搜索API(此http://search.twitter.com/search.json?q=hi) 语言并不重要。 编辑//然后如何将进一步的更新附加到EOF? 编辑2 //确实,答案很好,但是我接受了我认为最优雅的答案。 问题答案: 这在任何语言中都很容易,但是机制各不相同。使用wget和shell: 追加: 使用P