Sinatra
Heroku
DB

Sinatra-ActiverecordをHerokuにPushする

More than 3 years have passed since last update.

sinatra/activerecordを使ってDB操作するプログラムをHerokuへアップロードする際のメモ。

Herokuでアカウントを作っていることが前提。


Herokuの設定

まず、Herokuにpostgresqlをアドオンする。

Herokuのマイページにログインして、「Add-ons」タブをクリックして、Heroku Postgresを選択するとアドオンできる。Hobby Devプランだと無料で20コネクション、1万行まで利用できる。

アドオンすると、HEROKU_POSTGRESQL_(COLOR)_URLというデータベース名(ショートカット名)が割り当てられる。

ちなみにローカルマシンの端末から下記コマンドでもアドオンできる。

$ heroku addons:add heroku-postgresql

...
Attached as HEROKU_POSTGRESQL_YELLOW_URL
Database has been created and is available
....

次に、Herokuでは、HEROKU_POSTGRESQL_(COLOR)_URLDATABASE_URLにマッチングすることを推奨しているので、その通りにする。コマンドは以下。

$ heroku pg:promote HEROKU_POSTGRESQL_(COLOR)_URL

これで、一旦HerokuのPostgresqlの設定を確認する。

$ heroku config

=== herokuapp Config Vars
DATABASE_URL: postgres://〜
HEROKU_POSTGRESQL_(COLOR)_URL: postgres://〜
....

となっていればOK。

ちなみに、postgresのURLの意味は

postgres://username:password@host:port/databasename


DBの接続設定とマイグレーション設定

Activerecordを使って、DBの接続設定を行い、マイグレーションしてDBテーブルを作成する。

事前に$bundle exec rake db:create_migrationでマイグレーション用ファイルを生成しておきましょう。

まず、Activerecordの接続設定を行う。先ほど設定してDATABASE_URLを使う。ローカルの開発環境のDB接続設定も合わせてURL表記にして、||でつなげておく。

もしくは、ローカル環境の環境変数にもDATABASE_URLを設定しておいてもよい。

ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'] || 'sqlite3://localhost/***.db')

ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'] || 'postgresql://username:password@localhost:5432/databasename')

require 'dotenv'  # .envファイルを読み込めるgem

Dotenv.load
ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'])

HerokuはDB接続を自動でコネクションを切断しないため、数回(5回?)のアクセスで、ActiveRecord::ConnectionTimeoutErrorが発生して、Internal Server Errorとなる。ソース内でconnectionを切断するように設定する必要あり。ひとまず、config.ruにActiveRecord::ConnectionAdapters::ConnectionManagementを読み込ませておくと解決する。詳細は勉強中です。


config.ru

require './app'

use ActiveRecord::ConnectionAdapters::ConnectionManagement

run Sinatra::Application



HerokuへのアップロードとDBマイグレーション

ここまでできたら、Herokuへアップロード。その前に、.gitignoreにアップロードしないファイルを記述しておく。

最低限以下3つは書いておくと良い。

/vendor/bundle

/.DS_Store
/.env

$ git add .

$ git commit -m 'comment'
$ git push heroku master

アップロードしたら、HerokuのDBをマイグレーションする。

$ heroku run bundle exec rake db:migrate

これでOK。マイグレーションには、sinatra/activerecord/rakeを使うので、bundle execを指定しないとエラーとなる。


注意点(ハマったこと)


  • 最初はdatabase.ymlを使おうとしたが、どうやらHerokuでは、database.ymlを自動で生成するらしく、手動設定しても意味が無いみたい。結局、URL指定のやり方しかできなかった。


  • Heroku上でのマイグレーションは、ちゃんとbundle execしましょう。


  • ローカル環境では、ActiveRecordのコネクションを自動切断してくれるが、heroku-postgresは自動切断してくれない。自分でコネクション切断処理を書かないとダメ。これに一番ハマった!!


  • pushと同時にbundle installをするらしく、gemのバージョンを揃えるにはGemfileにバージョンもちゃんと指定しておく必要あり。


  • .gitignoreは、一度commitしたものには反映されないので、一旦$git rm --cachedしておく必要あり。gitで管理しているファイル一覧を見るコマンド$git ls-filesで内容を確認しましょう。



  • テーブルを作り直す場合は、一旦DBを消去する必要あり。

     $ $heroku pg:reset DATABASE_URL --confirm app
    


  • Herokuではsinatra/reloaderが使えない。当たり前ではあるが。

    ローカルでは利用したいので、以下のようにしてみた。


if(ENV['RACK_ENV']=='development')

require 'sinatra/reloader'
end


その他

Herokuでよく使うコマンド。



  • Herokuのタイムゾーンを東京にする。

    $ heroku config:add TZ=Asia/Tokyo
    



  • Herokuのログを見る。

    $ heroku logs
    



お世話になったサイト