2015-12-29

Heroku Postgresのスキーマをローカルに落として開発する

Heroku Connectを使うとHeroku Postgres側に自動的にスキーマが生成される感じになるので、開発する場合は

の2パターンで開発することになります。ただ、前者の場合は同一DBに複数人が開発用として接続することになるので、ミスってデータやテーブルを削除したときや、ユニークなデータを格納したつもりがバッティングしてダメとか、開発上色々と問題があります。さらに東京-US間のレイテンシがあるのでDB接続も低速です。

ということで、実際に開発する場合は後者のパターンになるのですが、この「Heroku Postgresのスキーマをローカルに持っていく」やり方を備忘として残しておきます。

herokuコマンドをインストール

ubuntuだとこんな感じ
$ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
$ heroku login

Heroku Postgresのバックアップ&ダンプファイル取得

$ heroku pg:backups capture --app {app_name}
$ curl -o schema.dump `heroku pg:backups public-url --app {app_name}`

ローカルにリストア

$ pg_restore --verbose --clean --no-acl --no-owner \
> -h localhost -d {database} -U {username} schema.dump

補足 pg_dumpを使うパターン

以下のコマンドで同じようにダンプできます。pg:backupsはレコードもバックアップしちゃいますが、スキーマだけとか、あるオブジェクトだけ、とかそういった細かいダンプの制御が可能なのが利点です。あとはheroku toolbeltも不要なのも良いですね。
$ pg_dump -U {username} -h {host} -p {port} --schema-only -Fc {database} > schema.dump

その他

hstoreの拡張が入っていないとエラーになります。Ubuntuの場合はこんな感じでインストールすればOK。
$ sudo apt-get install postgresql-contrib

 

自動化とかの理由でpg_restoreやpsqlでのパスワードを省略するには、ホーム直下に.pgpassを置くか、環境変数を設定するかで対応することができます。

ファイルを置く場合はこんな感じで↓

$ vim .pgpass
> localhost:5432:{database}:{username}:{password}

参考URL↓

環境変数でやる場合はこんな感じで↓
$ export PGPASSWORD={password}

 

ローカルのpg_dumpのバージョンとHeroku Postgres側のバージョンが違うと以下の様なエラーが出ます。

pg_dump: server version: 9.4.x; pg_dump version: 9.3.x
pg_dump: aborting because of server version mismatch

Heroku Postgres側のバージョンは手も足も出ないので、この場合はローカル側のpg_dumpをアップグレードしてバージョンを合わせればOKです。

参考URL→PostgreSQL 9.4 を Ubuntu 14.04 にインストールする - ttanimichi's blog

このエントリーをはてなブックマークに追加