DBの利用を通じて実践的な課題対応を学ぶ


データベースとは

この章はおそらく今回の一連の内容の中で一番難しいです。いきなり全てを理解することは難しいので「そんな感じかなぁ」くらいで最初は流しても大丈夫です。データベースやマイグレーションなどの必要な概念を理解すると一気にわかってくるので、この辺りを別途補うなどしてみてください。

データベースとは、システムの中で情報を保存しておく倉庫のようなものです。倉庫の中には種類ごとに整理されて情報が保存されていて、条件を指定して情報を取り出したり、新たな情報を保存することができます。ここでは連絡帳に保存される人の情報(人の名前の項目だけを持っています)を保存することをやってみましょう。

データベースには様々な種類がありますが、ここでは簡単に扱えるsqlite3を利用することになります。

注意:ここではデータベースについて深い解説は行いません。例えば下記のような事前学習をすることで理解が深まるでしょう。

  • 「データベース 概要」で検索して一番簡単な記事を読んでみよう。

下記の講義形式の動画もお試しください。

動画の流れ

調査

  • 「database sinatra」で検索をするとSinatraActiveRecordという項目が多いようです。
  • そこで、sinatra-activerecordというgemの本家のサイトを読んでみます。

ドキュメントに倣って準備してみる

  • 以下のgemファイルをsinatra-activerecordのサイトからコピーします。
gem "sinatra-activerecord"
gem "sqlite3" # これはとても簡単に扱えるデータベースです
gem "rake"
  • 前章で用意したGemfileに貼り付けます。

Gemfile

source 'http://rubygems.org'
gem 'rubygems-update'

gem 'sinatra'
gem 'sinatra-reloader'
gem "sinatra-activerecord"
gem "sqlite3"
gem "rake"
  • データベースへの接続設定もサイトに従ってapp.rbに追記します。

app.rb

…

Bundler.require

set :database, {adapter: "sqlite3", database: "contacts.sqlite3"} # contacts.sqlite3に変更してここに追記

…
  • Rakefileというファイルを作成します。
  • 作成したRakefile内にサイトからコピーした以下の内容を貼り付けます。

Rakefile

# Rakefile
require "sinatra/activerecord/rake"

namespace :db do
  task :load_config do
    require "./app"
  end
end
  • bundle installGemfile内に記述したファイルをインストールします。
  • bundle exec rake -Tでコマンド一覧が出ることを確認します。

データベースにcontactsテーブルを作成する

  • コマンドを打ってマイグレーションファイルを作成します。
bundle exec rake db:create_migration NAME=create_contacts
  • db/migrate/内に下記のようなマイグレーションファイルが作成されます。
    xxxxxxxxxxxxxx_create_contacts.rb
class CreateContacts < ActiveRecord::Migration
  def change
  end
end
  • マイグレーションファイルの中身もサイトからコピーした内容を貼り付けて編集します。
class CreateContacts < ActiveRecord::Migration
  def change
    # contactsという名前のテーブルを、nameという項目を持って作成する為の設定
    create_table :contacts do |t| #ここはusersから変更
      t.string :name
    end
  end
end
  • bundle exec rake db:migrateでマイグレーションを実行します。
  • マイグレーションファイルの中身に従ってcontactsテーブルが作成されます。

作成したcontactsテーブルに合わせてモデルを用意する

モデルは、データベースから取り出した情報を一時的に格納しておく箱のようなものです。データベースの内容に合わせて準備をします。

  • 以下の記述をapp.rbに追加します。

app.rb

set :database, {adapter: "sqlite3", database: "contacts.sqlite3"}

# 以下がモデルの記述です
class Contact < ActiveRecord::Base
  validates_presence_of :name # nameの項目は必須入力という設定
end

ここまででSinatraでデータベースを使う準備は終了です。

データベースにcontact情報を保存するコードを書く

データベースにFormから入力されたデータを保存するプログラムを書いていきます。

  • name = params[:name]で送信されたデータのnameという項目を変数に代入します。
  • contact = Contact.new({name: name}) で送信されたデータnameが入った箱を作ります。
  • contact.save とすると上で作った箱の中身がデータベースに保存されます。

app.rb

    post '/contacts' do
      puts "### これはポストされたデータです ###"
      p params

   name = params[:name]
      # ここでDBに保存する

   contact = Contact.new({name: name})
   contact.save
      redirect '/'
    end
  • bundle exec ruby app.rb -p $PORT -o $IPでアプリを起動します。
  • 動作を確かめます。フォームから試しに適当な値を送信してみます。
  • コンソールのログを確認し、以下のような記述があることを確認します。
    • 下記のようなログcommit transactionが出れば成功です。
D, [2016-0x-xxT08:39:52.328782 #3778] DEBUG -- :    (0.1ms)  begin transaction
D, [2016-0x-xxT08:39:52.338538 #3778] DEBUG -- :   SQL (0.6ms)  INSERT INTO "contacts" ("name") VALUES (?)  [["name", "ああああ"]]
D, [2016-0x-xxT08:39:52.351008 #3778] DEBUG -- :    (12.0ms)  commit transaction

(補足)マイグレーションについて

ちょっと難しい概念なので、サラッと説明するのが難しいのですが、下記のような概要になります。

  • migrationとはデータベースのテーブルの構造を作成、変更するための仕組みです。
  • 先にマイグレーションファイルというファイルを準備します。
  • その後にコンソール(ターミナル)からコマンドを打つとテーブルの構造を作成、変更できます。

いろいろやってみよう

  • 保存したデータが入っていることを確認してみましょう。
  • 今回保存したデータはコマンドを使ってsqlite3の情報として取り出すこともできます。
  • コンソールからsqlite3 contacts.sqlite3でsqlite3のデータベース内に入ってみましょう。
  • select * from contacts;というSQL文を実行して、データが入っていることを確認しましょう。
username:~/workspace (sinatra-activerecord) $ sqlite3 contacts.sqlite3
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from contacts;
1|ああああ
sqlite>

検索してみよう

  • 「SQL 逆引き」 で検索してSQL文の構文集を開いてみましょう。
  • SQL文 select * from contacts; はどのような意味(命令)なのか確かめてみましょう。
  • contact.saveを実行したときにコンソールのログに出たSQL文を見てみましょう。
  • SQL文 INSERT INTO "contacts" ("name") VALUES (?) [["name", "ああああ"]]の意味も確認してみましょう。
  • 「ActiveRecord migration」で検索してみましょう。Ruby on Railsの解説が多いと思いますが、コマンドが少し違うだけで概念は同じものです。

今回のコードはこちらで確認することができます。

前の章へ戻る

次の章へ進む