PostgreSQL的外部表使用


postgresql從9.1開始增加了外部表訪問的功能,這個功能就是數據庫直接讀取數據庫以外的文件,比如csv或者text等類型的文件,暫時不支持DML。postgresql有各種插件能直連各種異構DB,如oracle_fdw,mysql_fdw,file_fdw等,對數據的遷移是很方便的,這是PG的擴展性較強的一個表現。這里介紹foreign data wrapper的file_fdw使用。 


一、環境: 
OS :CentOS 6.3 
DB :PostgreSQL 9.3 

二、使用過程 
1.創建擴展,因為默認不安裝,安裝需要手工創建

[postgres@kenyon ~]$ psql
psql (9.3.0) Type "help" for help. postgres=# CREATE EXTENSION file_fdw; CREATE EXTENSION postgres=# \dx List of installed extensions Name | Version | Schema | Description ----------+---------+------------+------------------------------------------- file_fdw | 1.0 | public | foreign-data wrapper for flat file access plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (2 rows)

2.創建外部表服務接口,查看

postgres=# create server pg_file_server foreign data wrapper file_fdw; CREATE SERVER postgres=# \des List of foreign servers Name | Owner | Foreign-data wrapper ----------------+----------+---------------------- pg_file_server | postgres | file_fdw (1 row)

3.建立一個外部表,與外部文件結構一致

postgres=# create foreign table tab_area(id int,cname varchar(80),ename varchar(80),create_time varchar(30)) server pg_file_server options(filename '/home/postgres/data1.csv',format 'csv',header 'true',delimiter ',',null '1'); 

--后面options里面參數的說明 --filename后面是文件名和絕對路徑 --format是格式,csv是逗號分隔,text表示是tab分隔的方式 --delimiter是分隔符 --header表示第一行數據是否需要 --null表示空數據的轉化處理,例子中字段1將轉化為null

4.上傳外部文件

[postgres@kenyon ~]$ more data1.csv 
?ID,cname,ename,create_time
1,浙江,zhejiang,2013-01-01 2,杭州,hangzhou,2013-01-02 3,北京,beijing,2012-09-12 4,默認,,2013-09-10 5,四川,sichuan,2012-12-12 6,,nanjing, 7,甘肅,,1998-12-12

5.查詢

postgres=# select * from tab_area; id | cname | ename | create_time ----+-------+----------+------------- | 浙江 | zhejiang | 2013-01-01 2 | 杭州 | hangzhou | 2013-01-02 3 | 北京 | beijing | 2012-09-12 4 | 默認 | | 2013-09-10 5 | 四川 | sichuan | 2012-12-12 6 | | nanjing | 7 | 甘肅 | | 1998-12-12 (7 rows)

6.查看外部表

postgres=# \d+ tab_area                                     Foreign table "public.tab_area"    Column    |         Type          | Modifiers | FDW Options | Storage  | Stats target | Description  -------------+-----------------------+-----------+-------------+----------+--------------+-------------  id          | integer               |           |             | plain    |              |   cname       | character varying(80) |           |             | extended |              |   ename       | character varying(80) |           |             | extended |              |   create_time | character varying(10) |           |             | extended |              |  Server: pg_file_server FDW Options: (filename '/home/postgres/data1.csv', format 'csv', delimiter ',', header 'true', "null" '1') Has OIDs: no

7.與實際普通表的結合

postgres=# create table tab_act_area as select * from tab_area; SELECT 7 postgres=# insert into tab_act_area select * from tab_area where id>2; INSERT 0 5 postgres=# \d+ List of relations Schema | Name | Type | Owner | Size | Description --------+--------------+---------------+----------+------------+------------- public | empsalary | table | postgres | 16 kB | public | tab_act_area | table | postgres | 8192 bytes | public | tab_area | foreign table | postgres | 0 bytes | public | test | table | postgres | 5096 kB | (4 rows)

8.修改外部表

postgres=# alter foreign table tab_area options(set null '^null*'); ALTER FOREIGN TABLE postgres=# select * from tab_area; id | cname | ename | create_time ----+-------+----------+------------- 1 | 浙江 | zhejiang | 2013-01-01 2 | 杭州 | hangzhou | 2013-01-02 3 | 北京 | beijing | 2012-09-12 4 | 默認 | | 2013-09-10 5 | 四川 | sichuan | 2012-12-12 6 | | nanjing | 7 | 甘肅 | | 1998-12-12 (7 rows)

其他語法和普通表類似,除了option的三個選項(drop、add和set) ,具體參考: 

http://www.postgresql.org/docs/9.3/static/sql-alterforeigntable.html

9.工具的使用


三總結: 
1.外部表實際不存儲數據,只是一張表結構; 
2.9.2版本比9.1版本多了option的選擇,9.3又多了collate一些排序的補充,功能進一步完善,現在已有約束、default普通表的應有功能; 
3.實用性,對定期的數據抽取但無需入庫檢查是很方便的,既減少了數據存儲,像基於postgresql的greenplum的數據導入導出就非常實用

參考資料:https://wiki.postgresql.org/wiki/Foreign_data_wrappers

 

這是一片轉載文章,只為收錄,原文地址:https://my.oschina.net/Kenyon/blog/165432


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM