在 Postgres 中的文件中导出数据

Posted

技术标签:

【中文标题】在 Postgres 中的文件中导出数据【英文标题】:Export data in file in Postgres 【发布时间】:2017-12-01 18:35:41 【问题描述】:

我有一张带有 id、name 和复杂查询的表。下面只是该表的一个示例..

ID  name          Query
1   advisor_1     "Select * from advisor"
2   student_1     "Select * from student where id = 12"
3   faculty_4     "Select * from student where id = 12"

我想遍历这个表并将每条记录保存到 csv 文件中

有什么方法可以通过匿名阻止自动完成。 我不想手动执行此操作,因为表有很多行。

有人可以帮忙吗?

【问题讨论】:

COPY TO with csv in dynamic SQL 将在 DO 块中工作,但您需要成为超级用户才能获得写入服务器端文件的权限。 @DanielVérité 我试过了..但我没有超级用户权限..还有其他方法吗? 如果没有超级用户,您只能复制到标准输出,但不能从匿名块中复制。然而,使用任何编程语言都相对容易,只需遍历表的结果,然后为每个结果发出 COPY 即可。使用 java 查看this example。 我可以在匿名块中使用 \copy 命令吗?或者我可以在 psql 中迭代吗? 您绝对应该指定您可以使用的工具集。 BTW 看看\gexec metacommand(从 9.6 版本开始引入) 【参考方案1】:

不是超级用户意味着无法在服务器端 DO 块中完成导出。

可以使用任何可以与数据库对话的编程语言在客户端完成,或者假设只有 psql 环境,可以使用 SQL 查询生成\copy 语句的列表。

作为后者的一个例子,假设唯一的输出文件名是从 ID 列构建的,这样的事情应该可以工作:

SELECT format('\copy (%s) TO ''file-%s.csv'' CSV', query, id)
 FROM table_with_queries;

这个查询的结果应该以可以直接包含在psql中的格式放入一个文件中,如下所示:

\pset format unaligned
\pset tuples_only on

-- \g with an argument treats it as an output file.
SELECT format('\copy (%s) TO ''file-%s.csv'' CSV', query, id)
 FROM table_with_queries \g /tmp/commands.sql

\i /tmp/commands.sql

作为旁注,该进程无法使用 PG 9.6 中引入的 \gexec 元命令进行管理,因为 \copy 本身就是一个元命令。 \gexec 仅对 SQL 查询进行迭代,而不对元命令进行迭代。否则,整个事情可以通过单个 \gexec 调用来完成。

【讨论】:

会为每一行生成文件吗? @MadhuraMhatre:是的。它假定您希望每个查询都有不同的输出文件。 不适用于该查询的每一行我想要的每个查询【参考方案2】:

你可以使用这样的函数:(如果你的问题是代码)

DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT id, query FROM table_name
    LOOP 
        EXECUTE('COPY (' || rec.query || ') TO ' || QUOTE_LITERAL('d:/csv' || rec.id || '.csv') || ' CSV'); 
    END LOOP;
END;

对于权限问题,您应该在服务器上使用您对它们具有写入权限(或来自供应商的请求)的某些位置。

【讨论】:

不幸的是我没有超级用户权限。我可以在匿名块中使用 \copy 命令吗?或者我可以在 psql 中迭代吗?

以上是关于在 Postgres 中的文件中导出数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 中导出数据库的模式?

PB中导出EXCEL怎么办?

在 Spring Boot 中使用 Copy 命令从 Postgres 导出数据

在 Excel 工作表单元格中导出数据

怎么从SQL数据库中导出 数据表 和导入脚本

怎样在MySQL数据库中导出整个数据库