SlideShare a Scribd company logo
1 of 60
Download to read offline
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
Sequelのすすめ
〜私がSQLを嫌いな理由〜
とみたまさひろ
RubyHiroba 2013
2013-06-02
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
自己紹介
とみた まさひろ
長野県北部在住
プログラマー (Ruby & C)
http://tmtms.hatenablog.com
http://twitter.com/tmtms
好きなもの
Ruby, MySQL, Linux Mint, Emacs, Git
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
OSS貢献者賞
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
諸君、私はSQLが嫌いだ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
select name from users
where loginid = 'tmtms'
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
英語っぽい
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
どれが予約語やねん
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
select name from users
where loginid = 'tmtms'
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
予約語が多い
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
カラム名にgroupが
使えなくて死ぬ
まぁクォートすればいいんだけども…
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
余計な単語
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
insert into tblname〜
select〜group by col
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
insert into tblname〜
select〜group by col
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
構文解析上なくてもいい
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
英語っぽくするため(?)
RSpecのようなキモさ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
insertとupdateの
構文の非対称
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
insert into tbl (col1,col2)
values (val1,val2)
update tbl set
col1=val1,col2=val2
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
全然違う
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
MySQLはこれも可能
insert tbl set
col1=val1,col2=val2
さすが変態
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
集約関数
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
select length(id) from tbl
select count(id) from tbl
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
select length(id) from tbl
→結果件数はレコード数
select count(id) from tbl
→結果件数は1
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
同じ構文なのに
関数によって結果が異なる
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
そんなこんなでSQL嫌い
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
SQLを書かずにRDBを使うには
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
Rubyで書けばいいじゃない
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
そこでSequel
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
テーブルの操作
SELECT col2 FROM tbl WHERE col1=1
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
条件で行の絞り込み
SELECT col2 FROM tbl WHERE col1=1
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
その中の列を選択
SELECT col2 FROM tbl WHERE col1=1
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
Sequelで
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
Sequel 初期化
require 'sequel'
DB = Sequel.connect(
'mysql://user:passwd@hostname:3306/dbname'
)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
コマンドラインから
% 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
テーブルの操作
DB[:tbl]
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
条件で行の絞り込み
DB[:tbl].where(col1: 1)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
その中の列を選択
DB[:tbl].where(col1: 1).select(:col2)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
とても自然!
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
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
Select は実行遅延
ds = DB[:tbl].where(col1: 1).select(:col2)
# まだ実行されない
ds.first
# ここで実行される
#=> {:col2=>'value'}
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
関数
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
集約関数
DB[:tbl].count
#=> SELECT COUNT(*) FROM tbl
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
条件いろいろ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
比較
where(id: 123)
#=> WHERE id=123
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
配列
where(id: [123, 456])
#=> WHERE id IN (123, 456)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
Range
where(id: 123..456)
#=> WHERE id >= 123 AND id <= 456
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
nil, true, false
where(id: nil)
#=> WHERE id is NULL
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
データセット
where(id: DB[:tbl2].select(:id))
#=> WHERE id IN (SELECT id FROM tbl2)
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
正規表現
where(id: /abc/)
#=> WHERE id REGEXP BINARY 'abc'
where(id: /abc/i)
#=> WHERE id REGEXP 'abc'
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
複数
where(id: 123, name:'hoge')
#=> WHERE id=123 AND name='hoge'
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
不等号
where(Sequel.expr(:id) > 123)
#=> WHERE id > 123
where{id > 123}
#=> WHERE id > 123
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
JOIN
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
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
自己結合
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
FAQ
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
Q. ActiveRecord じゃだめなん?
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
A1. Active Record は RDB にデー
タ置いて読み書きしてるだけで、
RDB として使ってるわけじゃないん
でちょっと…
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
A2. ActiveRecord は
Ruby/MySQL で動かないし…
そういえば activerecord-ruby_mysql-adapter ってのを
作ったような気もする
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
A3. でも Active Record 便利です
よね。Sequel でも使えるよ!
Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7
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
まとめ
SQL の構文はイケてない(個人の感想です)
Sequel で Ruby っぽくクエリを書ける
Sequel は Active Record パターンも使える
SQL を「シークエル」と発音する人は混乱す
るがいいさ

More Related Content

What's hot

blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べ
Masahiro Nagano
 
Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)
hiboma
 

What's hot (20)

Puppet on AWS
Puppet on AWSPuppet on AWS
Puppet on AWS
 
1周遅れのScala入学 #nds41
1周遅れのScala入学 #nds411周遅れのScala入学 #nds41
1周遅れのScala入学 #nds41
 
Zabbixを2分でインストール
Zabbixを2分でインストールZabbixを2分でインストール
Zabbixを2分でインストール
 
Mackerelによる
簡単サーバー管理入門と発展形
Mackerelによる
簡単サーバー管理入門と発展形Mackerelによる
簡単サーバー管理入門と発展形
Mackerelによる
簡単サーバー管理入門と発展形
 
ZabbixとAWS
ZabbixとAWSZabbixとAWS
ZabbixとAWS
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
 
Using Windows Azure
Using Windows AzureUsing Windows Azure
Using Windows Azure
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べ
 
MAASで管理するBaremetal server
MAASで管理するBaremetal serverMAASで管理するBaremetal server
MAASで管理するBaremetal server
 
Ansible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからAnsible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれから
 
Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)Sqale の Puppet と Chef (と テスト)
Sqale の Puppet と Chef (と テスト)
 
Apache Module
Apache ModuleApache Module
Apache Module
 
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発
 
Ansible roleとinventoryの書き方
Ansible roleとinventoryの書き方Ansible roleとinventoryの書き方
Ansible roleとinventoryの書き方
 
Vagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいVagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたい
 
Deep Dive into Modules
Deep Dive into ModulesDeep Dive into Modules
Deep Dive into Modules
 
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテストServerspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
 
Serverspec at Testing Framework Meeting
Serverspec at Testing Framework MeetingServerspec at Testing Framework Meeting
Serverspec at Testing Framework Meeting
 
Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門
 
Itamae-Serverspec入門
Itamae-Serverspec入門Itamae-Serverspec入門
Itamae-Serverspec入門
 

More from Masahiro Tomita

「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
Masahiro Tomita
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
Masahiro Tomita
 

More from Masahiro Tomita (20)

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろ
 
Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわい
 
CSV
CSVCSV
CSV
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
 
Ruby24
Ruby24Ruby24
Ruby24
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
MySQLを拡張する
MySQLを拡張するMySQLを拡張する
MySQLを拡張する
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
 
MyNAができるまで
MyNAができるまでMyNAができるまで
MyNAができるまで
 
文字化け
文字化け文字化け
文字化け
 
Crystal
CrystalCrystal
Crystal
 
メールの暗号化
メールの暗号化メールの暗号化
メールの暗号化
 
文字化け
文字化け文字化け
文字化け
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
 
🍣=🍺
🍣=🍺🍣=🍺
🍣=🍺
 

Recently uploaded

Recently uploaded (11)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 

Sequelのすすめ