Herokuに速攻デプロイするSinatraアプリテンプレートをつくる #2 PostgreSQL編

Special Thanks

以下の記事を参考にさせていただきました.

http://qiita.com/myokkie/items/6f65db5d53f19d34a27c

http://blog.ruedap.com/2011/04/16/ruby-sinatra-active-record-3-migrate

http://blog.notsobad.jp/post/60070706766/sinatra-activerecord-postgresql

  • Deploying Rack-based Apps (heroku公式)

https://devcenter.heroku.com/articles/rack#using-activerecord

はじめに

前回作ったSinatraのアプリケーションテンプレートをheroku用でデプロイする使い捨てアプリにするためにmodelを追加してPostgreSQL仕様にしてみます.

これで簡単にアプリをババっとつくってババっとデプロイできてしまう,というところを目指したい.

リポジトリは以下に置いてます.

totzYuta/lightest-sinatra-app-for-heroku · GitHub

手順

以下のコマンドでheroku用のpostgresqlツールをインストール.

$ heroku addons:create heroku-postgresql

これでデータベースが作成されます.

$ heroku config

でpostgresが設定されているようであればおk

DB接続設定

ということでActiveRecordでのDBへの接続設定を行います.

まずはpgのgemを追加します.

# Gemfile
gem 'pg'

と,ここで$ bundle insallしようとするとエラー.

pg_configがないと言われてしまった.

以下の記事によるとbrewでpstgresをインストールするとpg_configが作成されるらしいので,インストール.

http://qiita.com/youcune/items/5b783f7fde45d0fd4b35

$ brew install postgresql

再びgemのインストールにトライ

$ sudo gem install pg -v '0.18.2'
bundle install --path=vendor/bundle

これでうまくいきました.

migrateファイルの作成

以下の記事を参考にしていただき...

http://qiita.com/myokkie/items/b6b68b247ec7a110a1c4

ActiveRecordのgemも追加しましょー

# Gemfile
gem 'activerecord'
gem 'sinatra-activerecord'

もいちどbundle installして...

$ bundle install --path=vendor/bundle

そしたらここからmigrationファイルを作るためのrakeコマンドを使えるようにしていきます.

Rakefileを作成して以下を記述.

require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'

以下のコマンドを実行すると,使えるrakeタスクを確認できます.

$ bundle exec rake -T
rake db:create              # Creates the database from DATABASE_URL or config/databa...
rake db:create_migration    # Create a migration (parameters: NAME, VERSION)
rake db:drop                # Drops the database from DATABASE_URL or config/database...
rake db:fixtures:load       # Load fixtures into the current environment's database
rake db:migrate             # Migrate the database (options: VERSION=x, VERBOSE=false...
rake db:migrate:status      # Display status of migrations
rake db:rollback            # Rolls the schema back to the previous version (specify ...
rake db:schema:cache:clear  # Clear a db/schema_cache.dump file
rake db:schema:cache:dump   # Create a db/schema_cache.dump file
rake db:schema:dump         # Create a db/schema.rb file that is portable against any...
rake db:schema:load         # Load a schema.rb file into the database
rake db:seed                # Load the seed data from db/seeds.rb
rake db:setup               # Create the database, load the schema, and initialize wi...
rake db:structure:dump      # Dump the database structure to db/structure.sql
rake db:structure:load      # Recreate the databases from the structure.sql file
rake db:version             # Retrieves the current schema version number

したらrakeコマンドのdb:create_migrationタスクでマイグレーションファイルを作成します.

$ bundle exec rake db:create_migration NAME=create_users

すると以下のような感じでmigrationファイルが作成されてると思います.

$ cat db/migrate/20150610114355_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
  end
end

ふむふむ.Railsやこれは.

そしたらさきほどのmigrationファイルを編集してテーブルの構造を定義する.

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t| 
      t.string :email
      t.string :order
      t.timestamps  
    end
  end
end

app.rbの冒頭に以下を追加する.

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

class Count < ActiveRecord::Base; end

Rakefileに以下を追加

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

生成する

$ git push heroku master
$ heroku run rake db:migrate

$ heroku openで確認してみたけどApplication Errorになっていた.

$ heroku logs

で確認する.

どうやら

▶ bundle exec ruby app.rb
app.rb:8:in `<main>': uninitialized constant ActiveRecord (NameError)

ここでエラーが起こってる模様.

問題はapp.rbでactiverecordをrequireしてないだけでした.ということでapp.rbに以下を追加.

require 'activerecord'

これでいけた!

以下でDBにアクセスしてきちんとtableが作成されてるかどうか確認する.

▶ heroku pg:psql DATABASE_URL
=> \d
Schema |       Name        |   Type   |     Owner
--------+-------------------+----------+----------------
 public | schema_migrations | table    | mdktkrgwidnepi
 public | users             | table    | mdktkrgwidnepi
 public | users_id_seq      | sequence | mdktkrgwidnepi
 => \q

参考:pgの基本操作 http://www.marronkun.net/linux/other/database_000014.html

ということでめちゃくちゃ時間かかりましたがなんとかいけましたーー

次は簡単にデータを登録する処理を追加してみようと思います!