我有一个包含id,name和复杂查询的表。以下只是该表的一个示例..
False
我想迭代这个表并将每个记录保存到csv文件
有没有办法可以通过Anonymous阻止自动执行此操作。 我不想手动执行此操作,因为表格有很多行。
有人可以帮忙吗?
答案 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;
对于权限问题,您应该在服务器上使用一些您具有写入权限的地方(或来自供应商的请求)。