heroku の postgresql (shared plan) を使う

d:id:nshibazaki:20110724 の続きです。

前回デプロイしたアプリでは、自動で postgresql を使うように設定されてるようです。
特に、database.yml を設定しなくても。

今回は、DB周りの情報について少し調べたので、それをまとめてみます。

まだ、専用データベースについては試してないので、とりあえず情報を調べたって段階ですが。

参考資料

ここを参考にしてます。

http://devcenter.heroku.com/articles/database

このページには、専用DBの話やバックアップの話、パフォーマンスの話も載っています。
しかし、今回はそこは飛ばして、DBの設定方法だけに注目します。

また、Rails 初心者なので、コネクションプーリングとか、DB周りのチューニングの知識についても、特に考えないことにします。

Database の設定

config varの概要

DBの設定の話に入る前に、PaaS におけるアプリの作り方の特徴について少し説明します。

heroku には、config var ( Configuration and Config Vars | Heroku Dev Center )というのがあって、アプリ内の設定は、変数として指定するのだそうです

Java では、System#getProperty で取得するようなプロパティにあたるものです。

なぜ、こういう構成になってるか一応説明すると、ローカル環境とデプロイ環境では、DBなどに違うもの使います。そこで、アプリ内では、設定を変数を利用するという形にしておき、環境に応じて設定を切り替えられるようになってるそうです。

ちなみに、Java だとDIコンテナを使ことが多いと思います。しかし、DIコンテナ自体も複雑ですので、Java EEで作る複雑な構成を持つアプリじゃないと、かえって難しくしてる感じになっちゃいますね。

そういう意味で、RoRで設定を外部化するなら、変数という形で解決するとか、yaml でがんばる位で十分なんでしょうね。

SHARED_DATABASE_URL と DATABASE_URL

heroku に用意されているDBのURLは、この2つの変数に設定されています。
この変数の値を、database.yml に書いてあげることで、DBに使えるようになります。

DATABASE_URLの調べ方は、「heroku config」 コマンドで見るのが楽です。

(ちなみに、heroku console コマンドだと、ちょっとめんどくさいと思います。)

次に、この2つの変数について説明します。

SHARED_DATABASE_URL は、共有DBのURLです。
DATABASE_URL は、何もしてなければ、SHARED_DATABASE_URLと同じ値のはずです。
専用データベースを使う場合は、heroku pg:promote コマンドを使って手動で設定するようです。。

Heroku Postgres | Heroku Dev Center によると、
heroku pg:info コマンドで、利用可能なDBを一覧して、
heroku pg:promote コマンドで、DBを使う設定をするようです。

Using the DATABASE_URL environment variable (Rails)

専用データベースを使う場合:heroku console または、 heroku config でDATABASE_URL を確認します。

 "postgres://username:password@hostname/database"

これに対応するように、database.yml を設定します。

production: 
  encoding: unicode
  adapter: postgresql
  username: username
  port: 5432
  host: hostname
  database: database
  password: password

その後、git commit & git push heroku master して、heroku rake db:migate すれば、使えるようになります。

もし失敗したら、まずは http://devcenter.heroku.com/articles/database にある、「Common Issues Migrating to PostgreSQL」 とかFAQを見てみてください。

たとえば、テーブルがないって怒られたら、まずは、以下のコマンドを実行して、テーブルが存在するか確認してみてください。

$ heroku console

>> ActiveRecord::Base.connection.tables