iT邦幫忙

DAY 8
2

資料庫的操作是網站常需要的動作,
Rails的ORM預設的是 ActiveRecord,
Sinatra 也可適用,但也有 DataMapper 及 Sequel 的選擇。
本篇介紹 Sequel 的基本使用。
先從 CLI 界面學習 Sequel 的操作:
編輯一個 db.rb 檔:

require 'sequel'

DB = Sequel.connect('sqlite://i5.db')
DB.create_table?(:players) do
  primary_key :id
  text :u
  text :subject
  text :type
  text :status
  timestamp :created_at
  timestamp :updated_at
end

class Player < Sequel::Model
  plugin :timestamps
end

這樣就可以有像 ActiveRecord 般的 Player Model來操作。
新增一筆資料

$ irb --simple-prompt
>> require './db.rb'
=> true
>> Player.create(:u=>'twtw',:subject => '建立API為中心的輕量級網站', :type => 'tech', :status => ' 進行中')
=> #<Player @values={:id=>1, :u=>"twtw", :subject=>"建立API為中心的輕量級網站", :type=>"tech", :status=>"進行中", :created_at=>2012-10-17 10:26:29 +0800, :updated_at=>nil}>

在 model 裡加入 plugin :timestamps,
就會自動在 created_at 的欄位自動加入產生該筆資料的時間。

查詢一筆資料

>> p = Player.where(:id => 1).first
=> #<Player @values={:id=>1, :u=>"twtw", :subject=>"建立API為中心的輕量級網站", :type=>"tech", :status=>"進行中", :created_at=>2012-10-17 10:26:29 +0800, :updated_at=>nil}>

修改該筆資料

>> Player.where(:id => 1).update(:status => '已完成')
=> 1
>> Player.first
=> #<Player @values={:id=>1, :u=>"twtw", :subject=>"建立API為中心的輕量級網站", :type=>"tech", :status=>"已完成", :created_at=>2012-10-17 10:26:29 +0800, :updated_at=>nil}>

刪除一筆資料

>> Player.where(:id => 1).delete
=> 1
>> Player.all
=> []

上述是透過 CLI 操作基本的新增、查詢、修改、刪除的動作。
然後以此基礎建立到 Sinatra 的程式中:

configure do
  DB = Sequel.connect('sqlite://i5.db')
  DB.create_table?(:players) do
    primary_key :id
    text :u
    text :subject
    text :type
    text :status
    timestamp :created_at
    timestamp :updated_at
  end

  class Player < Sequel::Model
    plugin :timestamps
  end
end
get '/list' do
  Player.all.map{|x| x.values}.to_json
end

post '/create' do
  p=Player.create(params)
  p.inspect.to_s
end

delete '/players/:id' do
  result = Player.where(:id => params[:id]).delete
  if result.zero?
    '無此記錄'
  else
    '刪除成功'
  end
end

put '/players/:id' do |id|
  p = Player.find(:id => id)
  p.update(:u => params[:u], :subject => params[:subject], :status => params[:status])
  p.inspect.to_s
end

先不做有關 views 的form的部份,
而利用 curl 指令來操作:

$ curl -X DELETE http://i5.tagbible.net/players/1
無此記錄
$ curl http://i5.tagbible.net/list
[{"id":2,"u":"wtwt","subject":"從CURL改","type":"tech","status":"進行中","created_at":"2012-10-17 10:54:47 +0800","updated_at":"2012-10-17 11:28:52 +0800"}]
#修改 u, subject:
$ curl -X PUT --data "subject=進行中的活動&u=twtw&status=進行中" http://i5.tagbible.net/players/2
#<Player @values={:id=>2, :u=>"twtw", :subject=>"進行中的活動", :type=>"tech", :status=>"進行中", :created_at=>2012-10-17 10:54:47 +0800, :updated_at=>2012-10-17 11:37:51 +0800}>

這樣就有基本的CRUD的處理能力。

系列文章列表


上一篇
在 Sinatra 使用 template engine
下一篇
測試 Sinatra 的 session 機制
系列文
建立API為中心的輕量級網站30

1 則留言

我要留言

立即登入留言