简介
www_fdw 插件支持通过http协议把文本数据导入到PG/PPAS中
RDS PG/PPAS 新版本已经支持通过 www_fdw
下面简单介绍下使用方式
启动http服务
导入数据前,我们需要在文件服务器上启动一个http服务,再把要导入的文本数据放在对应目录
创建 www_fdw 插件
create extension www_fdw;
创建server和用户映射规则
CREATE SERVER www_fdw_test FOREIGN DATA WRAPPER www_fdw
OPTIONS (uri 'http://192.168.1.1/', request_serialize_callback 'test_request_serialize_callback',response_type'other', response_deserialize_callback 'test_response_deserialize_callback');
CREATE USER MAPPING FOR current_user SERVER www_fdw_test;
创建数据处理函数
这里需要注意的是,根据不同的格式的文本数据,需要定制下列函数,目的是把行数据拆分到表中的列
CREATE OR REPLACE FUNCTION test_request_serialize_callback(options WWWFdwOptions, quals text, INOUT url text, INOUT post WWWFdwPostParameters) AS
$$
BEGIN
RAISE NOTICE 'options parameter: %', options;
RAISE NOTICE 'quals parameter: %', quals;
RAISE NOTICE 'url parameter: %', url;
RAISE NOTICE 'post parameter: %', post;
url := url;
END;
$$
LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION test_response_deserialize_callback(options WWWFdwOptions, response text) RETURNS SETOF www_fdw_test AS
$$
DECLARE
title text;
link text;
snippet text;
rows text[];
i integer;
fields text[];
r RECORD;
BEGIN
RAISE DEBUG 'options parameter: %', options;
RAISE DEBUG 'response parameter: %', response;
rows := regexp_split_to_array(response, E'\\n');
RAISE NOTICE 'row: %', rows[0];
FOR i IN 1 .. array_length(rows,1) LOOP
fields := regexp_split_to_array(rows[i], E' ');
title := fields[1];
link := fields[2];
snippet := fields[3];
r := ROW(title, link, snippet);
RETURN NEXT r;
END LOOP;
END;
$$
LANGUAGE PLPGSQL;
创建外部表
CREATE FOREIGN TABLE www_fdw_test (
t1 text, t2 text ,t3 text
) SERVER www_fdw_test;
数据的访问
接下来用户就可以像访问表那样,访问对应http服务上的外部数据了.举例:
select * from www_fdw_test;