Sinatra+MySQL+ActiveRecordでDatabaseの設定を行う

以下のサイトを参考に、SinatraでのDatabaseの設定を行います。

Sinatra+ActiveRecord+MySQLで、簡単APIサーバ構築 - Qiita

作業的には非常に簡単なのですが忘れるのでw

準備

RubyMySQLをインストール出来ていない場合はインストールします。

ここが最初は結構大変なのですが、割愛します、すみません...笑

Macの場合はRubyの管理にrbenvを、パッケージの管理にbrewを使うのがおすすめです。以下を参考にしてみてください。

Ruby,MySQLの環境を構築する(Mac版) - Qiita

MySQL初期設定

次は、データを格納するためのデータベースとテーブルを作成しておきます。

僕はサーバーなど違う環境でも同じことが出来るよう以下のようにbootstrap.sqlみたいな名前をつけて初期化のためのSQL文を羅列したファイルを作成しておきました。

--bootstrap.sql
CREATE DATABASE IF NOT EXISTS database;
USE database

create table users (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  email VARCHAR(255) NOT NULL,
  order_num INT UNSIGNED NOT NULL,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  PRIMARY KEY(id)
);

そしたら以下のような感じにsqlスクリプトを渡しちゃえばデータベースとテーブルを一気に作ってくれるはずです。

$ mysql -u root -p -h localhost < bootstrap.sql

Bundler設定

gem管理のためにbundlerを導入します。まずinitしてGemfileを生成。

$ bundle init
# Gemfile
source "https://rubygems.org"

gem "activerecord"
gem "mysql2"
gem "sinatra"

mysql2を使えばまぁよさそうです。若干古いのですが下の記事を参照。

RubyでMySQLに繋ぐためのruby-mysqlとmysql2 - たごもりすメモ

そしてgemをインストール。

$ bundle install

これでgem関連はokですね。

database.ymlを作成

次にdatabaseの設定を書いておくdatabase.ymlというファイルを作成します。中身は以下のような感じで。

development:
  adapter: mysql2
  database: database
  host: localhost
  username: root
  password: xxxxxx
  encoding: utf8

こいつは.gitignoreに加えておきます。

app.rbをかく

そしてメインの部分を書いていきます。今回は省略して/app.rbのメイン部分にべた書きした場合。

# app.rb
require 'active_record'
require 'mysql2'
require 'sinatra'

# Import files for database
ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(:development)

class User < ActiveRecord::Base
end

get '/' do
  erb :index
end

post '/' do
  user = User.new
  user.email = params[:email]
  user.order_num = params[:order]
  user.save
  erb :index
end

ActiveRecordRailsでも使ってる分なじみがある感じで良い。object orientedな感じは若干ブラックボックス感が大きいですが直感的でやはりよいですねー。

おわり

これで一連のデータベース周りの設定はおわりです!

次はSinatraでのテストの書き方でも書いていこうかなー

diff

2015/06/07

上のdatabase.ymlでは以下のようなエラーがでたので,シンボルで渡すように変更した.

DEPRECATION WARNING: Passing a string to ActiveRecord::Base.establish_connection for a configuration lookup is deprecated, please pass a symbol (:development) instead. (called from <main> at app.rb:12)
- ActiveRecord::Base.establish_connection('development')
+ ActiveRecord::Base.establish_connection(:development)