在 Postgres 中导出文件中的数据

Export data in file in Postgres

我有一个 table,其中包含 ID、名称和复杂查询。下面只是其中的一个示例 table..

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"

我想遍历此 table 并将每条记录保存到 csv 文件中

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

有人可以帮忙吗?

您可以使用这样的函数:(IF 您的问题是代码)

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;

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

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

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

作为后者的一个例子,假设唯一的输出文件名是从 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 调用来完成。