• 検索結果がありません。

Sequel のすすめ 私が SQL を嫌いな理由 とみたまさひろ RubyHiroba Sequel のすすめ - 私が SQL を嫌いな理由 Powered by Rabbit 2.0.7

N/A
N/A
Protected

Academic year: 2021

シェア "Sequel のすすめ 私が SQL を嫌いな理由 とみたまさひろ RubyHiroba Sequel のすすめ - 私が SQL を嫌いな理由 Powered by Rabbit 2.0.7"

Copied!
60
0
0

読み込み中.... (全文を見る)

全文

(1)

Sequelのすすめ

〜私がSQLを嫌いな理由〜

とみたまさひろ

RubyHiroba 2013

2013-06-02

(2)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

自己紹介

とみた まさひろ

長野県北部在住

プログラマー (

Ruby

& C)

http://

tmtms

.hatenablog.com

http://twitter.com/

tmtms

好きなもの

(3)
(4)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(5)

select name from users

where loginid = 'tmtms'

(6)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(7)
(8)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

select name from users

where loginid = 'tmtms'

(9)
(10)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

カラム名にgroupが

使えなくて死ぬ

まぁクォートすればいいんだけども…

(11)
(12)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

insert into tblname〜

select〜group by col

(13)

insert into tblname〜

select〜group by col

(14)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(15)

英語っぽくするため(?)

RSpecのようなキモさ

(16)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

insertとupdateの

構文の非対称

(17)

insert into tbl (col1,col2)

values (val1,val2)

update tbl set

col1=val1,col2=val2

(18)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(19)

MySQLはこれも可能

insert tbl set

col1=val1,col2=val2

さすが変態

(20)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(21)

select length(id) from tbl

select count(id) from tbl

(22)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

select length(id) from tbl

→結果件数はレコード数

select count(id) from tbl

(23)

同じ構文なのに

(24)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(25)
(26)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(27)
(28)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

テーブルの操作

(29)

条件で行の絞り込み

SELECT col2 FROM tbl

WHERE col1=1

(30)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

その中の列を選択

SELECT col2

FROM tbl WHERE col1=1

(31)
(32)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

Sequel 初期化

require

'sequel'

DB = Sequel.connect(

'mysql://user:passwd@hostname:3306/dbname'

)

(33)

コマンドラインから

% sequel mysql://user:passwd@hostname:3306/dbname

Your database is stored in DB...

(34)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

テーブルの操作

DB[:tbl]

(35)

条件で行の絞り込み

DB[:tbl].

where(col1: 1)

(36)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

その中の列を選択

DB[:tbl].where(col1: 1).

select(:col2)

(37)
(38)

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)

(39)

Select は実行遅延

ds = DB[:tbl].where(col1: 1).select(:col2)

# まだ実行されない

ds.first

# ここで実行される

#=> {:col2=>'value'}

(40)

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)}

(41)

集約関数

DB[:tbl].count

(42)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(43)

比較

where(id: 123)

(44)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

配列

where(id: [123, 456])

(45)

Range

where(id: 123..456)

(46)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

nil, true, false

where(id: nil)

(47)

データセット

where(id: DB[:tbl2].select(:id))

(48)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

正規表現

where(id: /abc/)

#=> WHERE id REGEXP BINARY 'abc'

where(id: /abc/i)

(49)

複数

where(id: 123, name:

'hoge'

)

(50)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

不等号

where(Sequel.expr(:id) > 123)

#=> WHERE id > 123

where{id > 123}

#=> WHERE id > 123

(51)
(52)

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

(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

(54)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

(55)
(56)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

A1. Active Record は RDB にデー

タ置いて読み書きしてるだけで、

RDB として使ってるわけじゃないん

(57)

A2. ActiveRecord は

Ruby/MySQL で動かないし…

そういえば activerecord-ruby_mysql-adapter ってのを

(58)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

A3. でも Active Record 便利です

よね。Sequel でも使えるよ!

(59)

Sequel::Model

class User < Sequel::Model

plugin :validation_helpers

def validate

super

validates_unique :loginid

validates_presence :name

end

end

(60)

Sequelのすすめ - 〜私がSQLを嫌いな理由〜 Powered by Rabbit 2.0.7

まとめ

SQL の構文はイケてない

(個人の感想です)

Sequel で Ruby っぽくクエリを書ける

Sequel は Active Record パターンも使える

SQL を「シークエル」と発音する人は混乱す

るがいいさ

参照

関連したドキュメント

けいさん たす ひく かける わる せいすう しょうすう ぶんすう ながさ めんせき たいせき

タップします。 6通知設定が「ON」になっ ているのを確認して「た めしに実行する」ボタン をタップします。.

AC100Vの供給開始/供給停止を行います。 動作の緊急停止を行います。

最愛の隣人・中国と、相互理解を深める友愛のこころ

7.自助グループ

【会長】

委 員:重症心身障害児の実数は、なかなか統計が取れないという特徴があり ます。理由として、出生後

・カメラには、日付 / 時刻などの設定を保持するためのリチ ウム充電池が内蔵されています。カメラにバッテリーを入