将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_frompg_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

    上一篇: Save PL/pgSQL output from PostgreSQL to a CSV file

    下一篇: execute a linux command using python