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で作る複雑な構成を持つアプリじゃないと、かえって難しくしてる感じになっちゃいますね。
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