Rabbit Slide Show

Sequelのすすめ

2013-06-02

Description

Sequel を使って Ruby でクエリを書こう

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

Other slides