Sinatra の MVC の M に Sequel を使ってみる
ライブラリの選択
Sinatra は MVC のモデルに関してのサポートはないので、DB を使ったアプリケーションを作成する場合は既存のO/Rマッピングライブラリを組み込むのがよさそう。サポートされていないことのメリットって、DBを使用しない場合は組み込まなくて済む(軽量化)、ライブラリに選択肢ができる、の二つくらいかな。逆にデメリットとしては、何を使えばいいのか迷うってところか。
で、迷った挙げ句(そんなに迷っていないが)Sequel を使うことに。理由は、情報が多そうだから。長いものには巻かれます。
- http://labs.unoh.net/2009/05/sinatra.html
- 第9回 SinatraとSequel・Hamlで掲示板アプリを作る:Ruby Freaks Lounge|gihyo.jp … 技術評論社
DB はSQLite。インストール済みだし、勉強用のアプリならこれで十分でしょう。
インストール
# gem install sequel % gem list | grep sequel sequel (3.3.0)
3.3.0がインストールされた。
テスト
とりあえず、DB を読み込んで内容を表示させる機能を作ってみる。
コントローラ
require 'rubygems' require 'sinatra' require 'sequel' Sequel::Model.plugin(:schema) Sequel.connect('sqlite://myapp.db') class Items < Sequel::Model unless table_exists? set_schema do primary_key :id string :name timestamp :created_at end create_table end end get '/' do @items = Items.all haml :index end
テンプレート
!!! XML !!! %html - @items.each do |item| %div %span= item.id %span= item.name %span= item.created_at
テストデータの登録
% sqlite3 myapp.db sqlite> insert into items (id, name, created_at) values (1, 'foo', current_timestamp); sqlite> insert into items (id, name, created_at) values (2, 'bar', current_timestamp); sqlite> insert into items (id, name, created_at) values (3, 'baz', current_timestamp); sqlite> select * from items; 1|foo|2009-08-18 13:39:57 2|bar|2009-08-18 13:40:16 3|baz|2009-08-18 13:41:32
実行結果
<?xml version='1.0' encoding='utf-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <div> <span>1</span> <span>foo</span> <span>Tue Aug 18 13:39:57 +0900 2009</span> </div> <div> <span>2</span> <span>bar</span> <span>Tue Aug 18 13:40:16 +0900 2009</span> </div> <div> <span>3</span> <span>baz</span> <span>Tue Aug 18 13:41:32 +0900 2009</span> </div> </html>
意外とすんなり出来た。登録、更新、削除もやってみないと。