想定ケース

  • ステージング環境と開発環境がある状況において、テスト目的で開発環境からステージング環境のデータベースに接続するようなケース。

ターゲット環境

  • ステージング環境
    • app名=app-staging
    • Heroku Postgres add-onをインストール済み
  • 開発環境
    • app名=app-dev
  • 手元にはHeroku Toolbeltインストール済み

手順:開発環境にステージング環境のPostgresをアタッチ

  • イメージ:開発環境にステージング環境のPostgresを繋ぐ作業

アタッチ

$ heroku addons:attach app-staging::DATABASE -a app-dev
Attaching postgresql-solid-12345 to app-dev... done
Setting HEROKU_POSTGRESQL_MAROON config vars and restarting app-dev... done

確認

$ heroku pg:info -a app-dev
=== HEROKU_POSTGRESQL_MAROON_URL
Plan:        Hobby-basic
Status:      Available
Connections: 0/20
PG Version:  9.5.2
Created:     2016-05-13 06:55 UTC
Data Size:   257.1 MB
Tables:      15
Rows:        697387/10000000 (In compliance)
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      postgresql-solid-12345

手順:アタッチしたデータベースをデフォルトデータベースにする

  • 上記手順でアタッチした状態だと、環境変数`HEROKU_POSTGRESQL_MAROON_URL`にアクセス情報が設定されています。なお、この`MAROON`部分はCOLOR文字列でランダムに変化します。
  • Herokuのアプリケーションは通常、環境変数`DATABASE_URL`にデータベースへのアクセス情報が設定されている前提で実装します。
  • つまり、アタッチしたデータベースをデフォルトデータベースにするということは、`HEROKU_POSTGRESQL_MAROON_URL`の値を`DATABASE_URL`へコピーする、というイメージになります。
$ heroku pg:promote HEROKU_POSTGRESQL_MAROON_URL -a app-dev
Promoting postgresql-solid-12345 to DATABASE_URL on app-dev... done

確認

  • `DATABASE_URL`へアタッチしたデータベースアクセス情報がセットされていることを確認できます。
  • これで参照先データベースを切り替えることができました。
$ heroku config -a app-dev
=== app-dev Config Vars
DATABASE_URL:                 postgres://useruser:passpass@ec2-54-32-10-11.compute-1.amazonaws.com:5432/dbname
HEROKU_POSTGRESQL_MAROON_URL: postgres://useruser:passpass@ec2-54-32-10-11.compute-1.amazonaws.com:5432/dbname
(snip)

facebook slideshare rubygems github qiita