Text
Page: 1
Sequelのすすめ
〜私がSQLを嫌いな理由〜
とみたまさひろ
RubyHiroba 2013
2013-06-02
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 2
自己紹介
とみた まさひろ
長野県北部在住
プログラマー (Ruby & C)
http://tmtms.hatenablog.com
http://twitter.com/tmtms
好きなもの
Ruby, MySQL, Linux Mint, Emacs, Git
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 3
OSS貢献者賞
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 4
諸君、私はSQLが嫌いだ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 5
select name from users
where loginid = 'tmtms'
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 6
英語っぽい
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 7
どれが予約語やねん
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 8
select name from users
where loginid = 'tmtms'
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 9
予約語が多い
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 10
カラム名にgroupが
使えなくて死ぬ
まぁクォートすればいいんだけども…
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 11
余計な単語
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 12
insert into tblname〜
select〜group by col
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 13
insert into tblname〜
select〜group by col
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 14
構文解析上なくてもいい
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 15
英語っぽくするため(?)
RSpecのようなキモさ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 16
insertとupdateの
構文の非対称
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 17
insert into tbl (col1,col2)
values (val1,val2)
update tbl set
col1=val1,col2=val2
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 18
全然違う
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 19
MySQLはこれも可能
insert tbl set
col1=val1,col2=val2
さすが変態
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 20
集約関数
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 21
select length(id) from tbl
select count(id) from tbl
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 22
select length(id) from tbl
→結果件数はレコード数
select count(id) from tbl
→結果件数は1
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 23
同じ構文なのに
関数によって結果が異なる
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 24
そんなこんなでSQL嫌い
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 25
SQLを書かずにRDBを使うには
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 26
Rubyで書けばいいじゃない
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 27
そこでSequel
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 28
テーブルの操作
SELECT col2 FROM tbl WHERE col1=1
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 29
条件で行の絞り込み
SELECT col2 FROM tbl WHERE col1=1
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 30
その中の列を選択
SELECT col2 FROM tbl WHERE col1=1
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 31
Sequelで
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 32
Sequel 初期化
require 'sequel'
DB = Sequel.connect(
'mysql://user:passwd@hostname:3306/dbname'
)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 33
コマンドラインから
% sequel mysql://user:passwd@hostname:3306/dbname
Your database is stored in DB...
irb(main):001:0>
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 34
テーブルの操作
DB[:tbl]
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 35
条件で行の絞り込み
DB[:tbl].where(col1: 1)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 36
その中の列を選択
DB[:tbl].where(col1: 1).select(:col2)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 37
とても自然!
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 38
Select/Update/Delete/Insert
DB[:tbl].where(col1: 1).select(:col2)
DB[:tbl].where(col1: 1).update(col2: 3)
DB[:tbl].where(col1: 1).delete
DB[:tbl].insert(col1: 1, col2: 2)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 39
Select は実行遅延
ds = DB[:tbl].where(col1: 1).select(:col2)
# まだ実行されない
ds.first
# ここで実行される
#=> {:col2=>'value'}
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 40
関数
DB[:tbl].select(Sequel.function(:length, :col))
#=> SELECT length(col) FROM tbl
DB[:tbl].select{length(col)}
#=> SELECT length(col) FROM tbl
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 41
集約関数
DB[:tbl].count
#=> SELECT COUNT(*) FROM tbl
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 42
条件いろいろ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 43
比較
where(id: 123)
#=> WHERE id=123
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 44
配列
where(id: [123, 456])
#=> WHERE id IN (123, 456)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 45
Range
where(id: 123..456)
#=> WHERE id >= 123 AND id <= 456
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 46
nil, true, false
where(id: nil)
#=> WHERE id is NULL
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 47
データセット
where(id: DB[:tbl2].select(:id))
#=> WHERE id IN (SELECT id FROM tbl2)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 48
正規表現
where(id: /abc/)
#=> WHERE id REGEXP BINARY 'abc'
where(id: /abc/i)
#=> WHERE id REGEXP 'abc'
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 49
複数
where(id: 123, name:'hoge')
#=> WHERE id=123 AND name='hoge'
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 50
不等号
where(Sequel.expr(:id) > 123)
#=> WHERE id > 123
where{id > 123}
#=> WHERE id > 123
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 51
JOIN
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 52
JOIN
DB[:posts].left_join(:users, :id=>:users_id)
#=> SELECT * FROM posts LEFT JOIN users
# ON users.id=posts.users_id
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 53
自己結合
DB[:hoge].left_join(:hoge.as(:fuga), :x=>:y).
select(:hoge__id)
#=> SELECT hoge.id FROM hoge
# LEFT JOIN hoge AS fuga
# ON fuga.x=hoge.y
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 54
FAQ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 55
Q. ActiveRecord じゃだめなん?
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 56
A1. Active Record は RDB にデー
タ置いて読み書きしてるだけで、
RDB として使ってるわけじゃないん
でちょっと…
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 57
A2. ActiveRecord は
Ruby/MySQL で動かないし…
そういえば activerecord-ruby_mysql-adapter ってのを
作ったような気もする
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 58
A3. でも Active Record 便利です
よね。Sequel でも使えるよ!
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 59
Sequel::Model
class User < Sequel::Model
plugin :validation_helpers
def validate
super
validates_unique :loginid
validates_presence :name
end
end
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7
Page: 60
まとめ
SQL の構文はイケてない (個人の感想です)
Sequel で Ruby っぽくクエリを書ける
Sequel は Active Record パターンも使える
SQL を「シークエル」と発音する人は混乱す
るがいいさ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜
Powered by Rabbit 2.0.7