
Contents
- 実行環境
- 参考サイト
- postgres_fdw
インストール(以上 2015.8.4) - 外部サーバとして
uDig のチュートリアル用DB を使う - 外部サーバに接続して
IMPORT FOREIGN SCHEMA - pgAdmin
で外部テーブルを表示する設定(以上 2015.8.5) - インポートした外部テーブルの確認(今ココ)
- 外部テーブルをローカルにコピー
- まとめ:列数の多いテーブル、テーブルの多いスキーマのコピーがすごい楽!
インポートした外部テーブルの確認
上のSELECT * FROM bc_border LIMIT 100;

次に


-- Remote Table CREATE TABLE bc_border ( gid serial NOT NULL, border_id integer, the_geom geometry, CONSTRAINT bc_border_pkey PRIMARY KEY (gid), CONSTRAINT enforce_dims_the_geom CHECK (ndims(the_geom) = 2), CONSTRAINT enforce_geotype_the_geom CHECK ( geometrytype(the_geom) = 'LINESTRING'::text OR the_geom IS NULL), CONSTRAINT enforce_srid_the_geom CHECK (srid(the_geom) = 4326) ) WITH ( OIDS=FALSE ); -- Foreign Table CREATE FOREIGN TABLE public.bc_border ( gid integer NOT NULL, border_id integer, the_geom public.geometry ) SERVER udig OPTIONS (schema_name 'public', table_name 'bc_border');
↓
psql -U postgres -p 5437 test_fdw psql (9.4.1, サーバー 9.5alpha1) 注意: psql メジャーバージョン 9.4, サーバーバージョン 9.5. psql の機能の中で、動作しないものがあるかもしれません。 "help" でヘルプを表示します. test_fdw=# \d bc_border 外部テーブル "public.bc_border" 列 | 型 | 修飾語 | FDWオプション -----------+----------+----------+--------------------------- gid | integer | not null | (column_name 'gid') border_id | integer | | (column_name 'border_id') the_geom | geometry | | (column_name 'the_geom') Server: udig FDW Options: (schema_name 'public', table_name 'bc_border')

9.5 Alpha 1
もっとも、今回の外部サーバの
外部テーブルをローカルにコピー
FDW似たことはすでに6
CREATE TABLE ローカルテーブル AS SELECT * FROM 外部テーブル;
この一行で済みます。下が実際の例。最初にコピー先のスキーマ
CREATE SCHEMA ft_copy; CREATE TABLE ft_copy.bc_border AS SELECT * FROM bc_border; Query returned successfully: 5199 rows affected, 15374 ms execution time.

↓ 同様に、残りのテーブル
CREATE TABLE ft_copy.bc_hospitals AS SELECT * FROM bc_hospitals; CREATE TABLE ft_copy.bc_municipality AS SELECT * FROM bc_municipality; CREATE TABLE ft_copy.bc_pubs AS SELECT * FROM bc_pubs; CREATE TABLE ft_copy.bc_voting_areas AS SELECT * FROM bc_voting_areas; Query returned successfully: 7986 rows affected, 43597 ms execution time.

↓ 終わった後のデータベース内。public

まとめ:列数の多いテーブル、テーブルの多いスキーマのコピーがすごい楽!
postgres_fdwCREATE SERVER [任意のサーバ名] FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '...', port '...', dbname '...'); CREATE USER MAPPING FOR [ローカルユーザ名] SERVER [上で設定したサーバ名] OPTIONS (user '...', password '...'); IMPORT FOREIGN SCHEMA [外部サーバのスキーマ名] LIMIT TO ( テーブル1, テーブル2, ... -- スキーマ内を一括取り込む場合は LIMIT TO 不要 ) FROM SERVER [設定したサーバ名] INTO [こちらのスキーマ名]; -- 以上で外部テーブル化できた -- 普通のローカルなテーブルにコピーしたければ、次を付加 CREATE TABLE [ローカルテーブル1] AS SELECT * FROM [外部テーブル1]; CREATE TABLE [ローカルテーブル2] AS SELECT * FROM [外部テーブル2]; ...
このように、各テーブルの列構成を確認・記述する手間なくできました。
最後にコピーしたテーブル

コピーしたいテーブルが一つでも ↓ のように使用可。後は、前項のように「CREATE TABLE ... AS SELECT * FROM ...」の一文でローカルテーブルにすれば
IMPORT FOREIGN SCHEMA [外部サーバのスキーマ名] LIMIT TO ( テーブル1 ) FROM SERVER [外部サーバ名] INTO こちらのスキーマ名;
テーブルが多いスキーマの場合、PL/pgSQL
DO $$ DECLARE tbn text; BEGIN FOR tbn IN SELECT relname FROM pg_class WHERE relkind = 'f' LOOP EXECUTE 'CREATE TABLE copy_' || tbn || ' AS SELECT * FROM ' || tbn; END LOOP; END; $$;
pg_dump
とかく