Heroku Connectを使うとHeroku Postgres側に自動的にスキーマが生成される感じになるので、開発する場合は
- ローカル開発環境からHeroku PostgresのDBに直接接続する
- Heroku Postgresのスキーマをローカル環境に持っていく
ということで、実際に開発する場合は後者のパターンになるのですが、この「Heroku Postgresのスキーマをローカルに持っていく」やり方を備忘として残しておきます。
herokuコマンドをインストール
ubuntuだとこんな感じ ```bash $ 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