在 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 中的文件中导出数据的主要内容,如果未能解决你的问题,请参考以下文章