こんにちは、hachi8833です。Craig Kerstiens氏のPostgreSQL記事の翻訳をお送りいたします。4年前の記事でPostgreSQLのバージョンも9.3ですが、現在および今後のPostgreSQL 10でも有用な内容だと思います。PostgreSQLへの移行に役立つツールについては、pgloader 3.41でMySQLからPostgreSQLへスマートに移行しよう(翻訳)をどうぞ。
概要
- 英語記事: A Look at Foreign Data Wrappers
- 英語記事公開日: 2013/08/05
- 著者: Craig Kerstiens: PostgreSQLのクラウドスケーリングサービスで知られるCitus Dataのメンバーであり、Herokuにも在籍したことがあります。
PostgreSQL拡張: 外部データラッパー(FDW)の概要(翻訳)
快進撃を続けるPostgreSQLには、特に私を惹きつけてやまない機能が2つあります。ここ数年のPostgreSQLの進歩は目覚ましいものがあり、この2つの機能によってPostgreSQLがさらに勢いづくのではないかと思っています。
その1つがPostgreSQL 拡張(extension)です。PostgreSQL拡張は今やそれだけで一分野を築いています。かのDimitri FontaineはPostgreSQL拡張だけでも多くの記事を書いていますので、私が書かずに済めばよいのにと思ったりもします。
しかし多くのPostgreSQL拡張の中でも、ぜひ別格として扱いたいものがあります。それが外部データラッパー(FDW)と呼ばれる拡張です。外部データラッパーを使うことで、PostgreSQL内で外部のデータソースに接続できるようになります。そこから外部データソースにSQLでクエリを送信することも、異なるデータセットをJOIN
することもできます。
ちょうど最近、postgres_fdw
を使うよい機会に恵まれました。Redis FDWについては以前にもブログに書いたことがありましたが、PostgreSQLのFDWは特に素晴らしいと思います。というのも、PostgreSQL 9.3ではpostgres_fdw
がcontrib moduleとしてリリースに含まれているので、PostgreSQLのインストーラにも必ず入っているはずだからです。後はpostgres_fdw
を有効にするだけで即使えます。
postgres_fdw
を動かしてみる
それではpostgres_fdw
を使ってみることにしましょう。このときはPostgreSQL 9.3が手元になかったので、HerokuのPostgreSQLからプロビジョニングすることにしました。
$ heroku addons:add heroku-postgresql:crane --version 9.3
PostgreSQLが使える状態になったら、後は拡張を有効にするだけです。
$ heroku pg:psql BLACK -acraig
# CREATE EXTENSION postgres_fdw;
これで準備OKです。早速動かしてみましょう。FDWで何か試すのであれば、基本的に次の4つの操作になると思います。
- リモートサーバーの作成
- リモートサーバー用のユーザーマッピングの作成
- 外部テーブルの作成
- 何かクエリを送信する
設定
以下をサーバーで1度ずつ実行するだけで、user
テーブルと外部テーブルをすべて設定でき、クエリを送信できるようになります。セッションの設定専用であるdb_link
と比べるとこの点が優れています。
ひとつ残念だったのは、PostgreSQLの接続文字列の一部が使えない点です。もし使えれば、設定はもっと簡単だったでしょう。それではサーバーを設定しましょう。
# CREATE SERVER app_db
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (dbname 'db名', host 'host名');
次は、実際にuser
のマッピングを作成します。この場合、リモートのユーザー名とパスワードを指定し、既に接続している現在のuser
にマップします。
# CREATE USER MAPPING for user_current
SERVER app_db
OPTIONS (user 'リモートユーザー名', password 'リモートパスワード');
最後にテーブルを設定します。このときはCREATE TABLE
をきれいに生成する完全な方法がなかったので、ここは少々がまんです。このテーブルはもちろんpg_dump
できますが、全体としてはややぎこちない感じでした。
# CREATE FOREIGN TABLE users
(
id integer,
email text,
created_at timestamp,
first_name text,
last_name text
)
SERVER app_db OPTIONS (table_name 'users')
これで、リモートデータもローカルデータと同じように取れました。以前だったらRubyやPythonで書かれた2つのデータベースに対してクエリを実行し、別のクエリを組み立ててから実行していたような作業を、データベースで直接実行できるようになります。これからは、新しいテーブルでSELECT * FROM users LIMIT 5;
を実行するだけでおしまいです。
しかしFDWの本当の実力はPostgreSQL間のマッピングにとどまりません。あるシステムから別のシステムへ変換する定義済みのcontractがあれば、データの扱いを根底から変革できます。これは、テラバイト級のデータからETLで取り出すと途方もない時間がかかる巨大データセットについて特に当てはまります。
記事執筆時点では、productionでの使用に耐えるFDWがもっと出現してくれるのを待ち望んでいる状況ではありますが、PostgreSQL FDWは初めての方にはうってつけだと思います(Redis FDWから始める手もありますが)。ありがたいことにPostgreSQL FDWはPostgreSQLに標準でインストールされるので、今後より進んだ使いこなし方法がさらに出現することでしょう。
最後にもうひとつうれしい情報を。PostgreSQLデータベースのバージョンは9.3で統一する必要はありません。データベースの1つが9.3であれば、そこから他のデータベースに接続できます。皆さまもお試しになってはどうでしょう。
関連記事(PostgreSQL)
- pgloader 3.41でMySQLからPostgreSQLへスマートに移行しよう(翻訳)
- PostgreSQLを使う理由(更新5年目)(翻訳)
- PostgreSQLの機能と便利技トップ10(2016年版)(翻訳)
- Rails開発者のためのPostgreSQLの便利技(翻訳)
- [Rails] RubyistのためのPostgreSQL EXPLAINガイド(翻訳)
- 【ゆるふわDocker部】任意バージョンのPostgreSQLコマンドを実行して外部DBに接続する
- RailsでPostgresを使おうとしてはまった