导出Postgres文件中的数据

时间:2017-12-01 18:35:41

标签: sql postgresql plpgsql psql

我有一个包含id,name和复杂查询的表。以下只是该表的一个示例..

False

我想迭代这个表并将每个记录保存到csv文件

有没有办法可以通过Anonymous阻止自动执行此操作。 我不想手动执行此操作,因为表格有很多行。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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调用来完成。

答案 1 :(得分:0)

您可以使用以下功能:( 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;

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

相关问题