今風にPostgreSQLの開発環境をつくってみた

最近ホットすぎるPostgreSQL界隈ですが、せっかくなので今風に開発環境を作ってみました。

PostgreSQLおさらい

近年のPostgreSQLの進歩は目覚しいものがあって、高いスケーラビリティはもちろん、アプリとの親和性の高さもあって注目度を増しています。

9.4系からはJSONBサポートに加えGINインデックスの性能強化等があって、RDBの特性を持ちながらドキュメントDBのような使い勝手を実現しています。MongoDBもびっくりですね。

ちなみにAmazon RDSにもつい最近9.4.1がサポートされましたね。 Amazon RDS for PostgreSQL support for major version 9.4.1

というわけでこんな今風なPostgreSQLを今風に環境構築してみようと思います。

Docker

今風なので、今回はDockerで環境を作ります。DockerのイメージはDockerHubにある最新の9.4.1のイメージを利用しましょう。

registry.hub.docker.com

さて、Dockerをローカル環境でホストするためにboot2dockerを利用します。boot2dockerはVirtualBox上の仮想環境で動作させるので、ローカル上にDocker環境が作られるわけではなく、仮想環境へのポートフォワードによってあたかもDockerをローカル上でホストしているように見せかけます。

PostgreSQLのコンテナ起動

docker runでコンテナを起動します。

 docker run -d -p 5432:5432 --name postgres-local -e POSTGRES_USER=tehepero -e POSTGRES_PASSWORD=tehepero postgres:9.4

色々とオプションがついてますが、簡単に説明すると以下の用途で使っています。docker runじゃなくてもFigを利用するのもありですね。

  • -d: デーモン起動
  • --name: コンテナの識別名
  • -p: boot2dockerの5432からコンテナ(ポスグレ)の5432へのポートフォワード
  • -e: POSTGRES_USERとPOSTGRES_PASSWORDでユーザーとパスワードの設定
VirtualBoxのポートフォワードの設定

docker runでコンテナでlistenしている5432ポートからboot2dockerの5432ポートまでのフォワードは完了していますが、ローカルマシンからboot2dockerまでのポートフォワードも必要です。VirtualBoxのポートフォワーディング設定で、5432のポートフォワード設定をします。

※この辺はVagrant使えばVagrantfileでやってくれることですね。

f:id:a-yamada:20150324114151p:plain

0xDBE

0xDBEはJetBrainsが開発しているデータベース開発用のIDEです。

www.jetbrains.com

現状はまだEAP版で、お布施無しで利用することができます。Homebrew Caskでのインストールができます。

$ brew cask install 0xdbe-eap

PostgreSQLに接続する設定をします。

f:id:a-yamada:20150324120308p:plain

最初driverが無くて警告が出るはずなので、downloadのリンクから落とすことができます。あとはdocker runしたときに設定したユーザーとパスワードを設定します。 f:id:a-yamada:20150324120317p:plain

Test Connectionを押して疎通確認してみましょう。 f:id:a-yamada:20150324121226p:plain

Driverが9.3ですよって言われてますがとりあえず気にしない。9.4のドライバを使うなら現状は手動で設定になりそうですね。

テーブルを作ってみる

デフォルトでpublicというschemaができているので、適当にテーブルを作ってみます。0xDBEでは以下の様なウィザードでテーブルを作成できます。 f:id:a-yamada:20150324121431p:plain

データを編集する

MySQLWorkbenchみたいに、スプレッドシード風なデータ作成・更新もできますね。 f:id:a-yamada:20150324122055p:plain

ちょっとまだ使い方がわからない面もあるけど、慣れの問題じゃないかな・・・

CIとの連携

僕がゴリ押ししているCircleCIでは、すでにPostgreSQL9.4に対応されています。CircleCIのコンテナでPostgreSQLを利用するには、circle.ymlで以下の設定を書くだけ。

machine:
  services:
    - postgresql

こうすればCI時に使い捨てのポスグレ環境が手に入ります。

あとPostgreSQLの良い所として、「DDLトランザクション内で発行できる」という特徴があります。ユニットテストでDBを利用したテストをする際にネックになるのはDBマイグレーションですが、これによってマイグレーションMySQL等と比較するとしやすいと言えます。アプリに優しいと言われるPostgreSQLの特徴の一つです。

まとめ

ポスグレの時代がやってきた