在 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
调用来完成。
我有一个 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
调用来完成。