昨日の続きです。PostgreSQL 9.5の新機能IMPORT FOREIGN SCHEMAを使い、外部のPostGISサーバに接続してスキーマごとデータを一括インポート。昨日は作業用データベース準備まで行い、結果は ↓ こんな感じ。今日の作業は全てWindows7+pgAdmin 1.20上です。
外部サーバとしてuDigのチュートリアル用DBを使う
uDigはオープンソースGISの一つ(デスクトップソフトウェア)で、そのチュートリアル用にPostGISのサンプルデータベースが公開されています。詳細は6月19日の記事参照。下記がuDigウェブサイトにあるDB接続案内で、ここからIMPORT FOREIGN SCHEMAできるか試します。
» uDig - Adding a Layer from PostGIS uDigを学ぶためという本来の趣旨とは違うけど、利用にあたっての制約等は特に見当たらないので今回使いました。6月19日の記事で書いたように、pgAdminでこのデータベースに接続してテーブルを見ると ↓ こんな感じ。publicスキーマにある、bc_で始まるテーブル5つがサンプルデータ。これを一括して、こちらのサーバの外部テーブルにします。
外部サーバに接続してIMPORT FOREIGN SCHEMA
まず、昨日準備した作業用データベース(postgre_fdwとPostGISインストール済み)上でクエリツールを開き、次のようなクエリで外部サーバとユーザマッピングを設定。
CREATE SERVER udig FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host 'www.refractions.net', port '5432', dbname 'demo-bc');
CREATE USER MAPPING FOR postgres
    SERVER udig
    OPTIONS (user 'demo', password 'demo');
CREATE SERVER文で外部サーバを設定します。実際はサーバというよりデータベースなので(dbnameを指定してる)用語で混乱しないよう注意。サーバ名は任意で、ここでは単純にudig。またユーザマッピングはFORの後がローカルユーザ名、OPTIONS内が外部サーバのユーザとパスワードで、後者のみクォート。 次が今回のメイン。IMPORT FOREING SCHEMAで、先方にある5つのテーブルを一括してこちらのpublicスキーマ下の外部テーブルに定義します。ひな形は ↓ こんな感じ。
IMPORT FOREIGN SCHEMA [外部サーバのスキーマ名] LIMIT TO (
    テーブル1,
    テーブル2,
    ...
) FROM SERVER [外部サーバ名] INTO [こちらのスキーマ名];
LIMIT TOは省略可能で、その場合は全テーブル・ビューが取り込まれます(ドキュメントの記述:By default, all tables and views existing in a particular schema on the foreign server are imported.)。またEXCEPTに続けて、取り込まないテーブル・ビューを指定することも可能。 PostGISのpublicスキーマにはシステムテーブル的なものがあり、今回はそれ以外の取り込むテーブルを個別指定しました。実行すると ↓ 数秒待ちましたが、無事完了。
IMPORT FOREIGN SCHEMA public LIMIT TO (
    bc_border,
    bc_hospitals,
    bc_municipality,
    bc_pubs,
    bc_voting_areas
) FROM SERVER udig INTO public;

Query returned successfully with no result in 4041 ms.
pgAdminで外部テーブルを表示する設定
結果を確認する前に、pgAdminで外部テーブルを表示する設定にします。というか最初これを忘れていて、クエリは成功したのに結果が変わらず「何で!?」と焦りました^^; メニューの「ファイル」から「オプション」で設定画面を開き、左側の上から二つ目「表示」を選んで下へスクロールすると ↓ なぜか二つ「外部テーブル」があります。(画面はpgAdmin 1.20) 英語UIにすると違いが分かりました。ExternalとForeignで、前者はGreenplum用らしい(古いバージョン1.10の画面説明より。GreenplumはPostgreSQLベースのデーベース製品)。後者だけチェックを入れれば、今回の外部テーブルは表示されます。日本語UIに戻すと両方にチェックが入っているけど…。 表示項目を変えると「反映するのにリフレッシュが必要」というダイアログ ↓ が出るので、その通りオブジェクトブラウザでリフレッシュ(データベースを選択してF5)。すると確かに、こちら側のスキーマ内に外部テーブルが出ました。 今日はここまで。明日、外部テーブルの確認と、ローカルへのコピーについて書きます。