rabbit-slide-tommy-sequel 2013.06.02
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/OSS/350/262/242/347/214/256/350/200/205/350/263/236.jpg +0 -0
- data/README.rd +24 -0
- data/Rakefile +9 -0
- data/config.yaml +18 -0
- data/pdf/sequel-sequel.pdf +0 -0
- data/sequel.rab +290 -0
- data/table1.png +0 -0
- data/table2.png +0 -0
- data/table3.png +0 -0
- metadata +67 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 15cf289c677f2bafaffe88694788eafde5897a75
|
4
|
+
data.tar.gz: 277b2bbf1c3028350a9134c4dce81f924c5f9fdf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f6165a4837c32bf16e0d00551e625d7e5d2a813e697b1ad598a6911a415d6aaeac14b5f86c4db98172b4d6b77dd6ccaad8154b5063e5970e57f485c0db2bb7c0
|
7
|
+
data.tar.gz: 661ae3a60a2db5dd6b0e2702df045faf63c66d9f9096c89e8a60278ae37686e210f21955bc6c79fc381ce557fe29ee9c47faf1d3ddc84a8f608d5db67a670104
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
sequel.rab
|
Binary file
|
data/README.rd
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
= Sequelのすすめ
|
2
|
+
|
3
|
+
Sequel を使って Ruby でクエリを書こう
|
4
|
+
|
5
|
+
== 作者向け
|
6
|
+
|
7
|
+
=== 表示
|
8
|
+
|
9
|
+
rake
|
10
|
+
|
11
|
+
=== 公開
|
12
|
+
|
13
|
+
rake publish
|
14
|
+
|
15
|
+
== 閲覧者向け
|
16
|
+
|
17
|
+
=== インストール
|
18
|
+
|
19
|
+
gem install rabbit-slide-tommy-sequel
|
20
|
+
|
21
|
+
=== 表示
|
22
|
+
|
23
|
+
rabbit rabbit-slide-tommy-sequel.gem
|
24
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
Rabbit::Task::Slide.new do |task|
|
6
|
+
# task.spec.files += Dir.glob("doc/**/*.*")
|
7
|
+
# task.spec.files -= Dir.glob("private/**/*.*")
|
8
|
+
# task.spec.add_runtime_dependency("YOUR THEME")
|
9
|
+
end
|
data/config.yaml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
id: sequel
|
3
|
+
base_name: sequel
|
4
|
+
tags: []
|
5
|
+
presentation_date: 2013/06/02
|
6
|
+
version: 2013.06.02
|
7
|
+
licenses: []
|
8
|
+
slideshare_id:
|
9
|
+
speaker_deck_id:
|
10
|
+
ustream_id:
|
11
|
+
vimeo_id:
|
12
|
+
author:
|
13
|
+
markup_language: :rd
|
14
|
+
name: とみたまさひろ
|
15
|
+
email: tommy@tmtm.org
|
16
|
+
rubygems_user: tommy
|
17
|
+
slideshare_user:
|
18
|
+
speaker_deck_user:
|
Binary file
|
data/sequel.rab
ADDED
@@ -0,0 +1,290 @@
|
|
1
|
+
= Sequelのすすめ
|
2
|
+
|
3
|
+
: subtitle
|
4
|
+
〜私がSQLを嫌いな理由〜
|
5
|
+
: author
|
6
|
+
とみたまさひろ
|
7
|
+
# : institution
|
8
|
+
# 所属
|
9
|
+
: content-source
|
10
|
+
RubyHiroba 2013
|
11
|
+
: date
|
12
|
+
2013-06-02
|
13
|
+
: allotted-time
|
14
|
+
5m
|
15
|
+
: theme
|
16
|
+
clear-blue+
|
17
|
+
|
18
|
+
= 自己紹介
|
19
|
+
|
20
|
+
* とみた まさひろ
|
21
|
+
* 長野県北部在住
|
22
|
+
* プログラマー (((*Ruby*)) & C)
|
23
|
+
* http://((*tmtms*)).hatenablog.com
|
24
|
+
* http://twitter.com/((*tmtms*))
|
25
|
+
* 好きなもの
|
26
|
+
* ((*Ruby*)), MySQL, Linux Mint, Emacs, Git
|
27
|
+
|
28
|
+
= OSS貢献者賞
|
29
|
+
|
30
|
+
# image
|
31
|
+
# src = OSS貢献者賞.jpg
|
32
|
+
# relative_height = 100
|
33
|
+
|
34
|
+
= 諸君、私はSQLが嫌いだ
|
35
|
+
|
36
|
+
= select name from users\n where loginid = 'tmtms'
|
37
|
+
|
38
|
+
= 英語っぽい
|
39
|
+
|
40
|
+
= どれが予約語やねん
|
41
|
+
|
42
|
+
= ((*select*)) name ((*from*)) users\n ((*where*)) loginid = 'tmtms'
|
43
|
+
|
44
|
+
= 予約語が多い
|
45
|
+
|
46
|
+
= カラム名に((*group*))が\n使えなくて死ぬ\n\n(('note:まぁクォートすればいいんだけども…'))
|
47
|
+
|
48
|
+
= 余計な単語
|
49
|
+
|
50
|
+
= insert into tblname〜\n\nselect〜group by col
|
51
|
+
|
52
|
+
= insert ((*into*)) tblname〜\n\nselect〜group ((*by*)) col
|
53
|
+
|
54
|
+
= 構文解析上なくてもいい
|
55
|
+
|
56
|
+
= 英語っぽくするため(?)\n\n(('note:RSpecのようなキモさ'))
|
57
|
+
|
58
|
+
= insertとupdateの\n構文の非対称
|
59
|
+
|
60
|
+
= insert into tbl (col1,col2) values (val1,val2)\n\nupdate tbl set col1=val1,col2=val2
|
61
|
+
|
62
|
+
= 全然違う
|
63
|
+
|
64
|
+
= MySQLはこれも可能\n\ninsert tbl set col1=val1,col2=val2\n\n(('note:さすが変態'))
|
65
|
+
|
66
|
+
= 集約関数
|
67
|
+
|
68
|
+
= select ((*length*))(id) from tbl\n\nselect ((*count*))(id) from tbl
|
69
|
+
|
70
|
+
= select ((*length*))(id) from tbl\n→結果件数は((*レコード数*))\n\nselect ((*count*))(id) from tbl\n→結果件数は((*1*))
|
71
|
+
|
72
|
+
= 同じ構文なのに\n関数によって結果が異なる
|
73
|
+
|
74
|
+
= そんなこんなでSQL嫌い
|
75
|
+
|
76
|
+
= SQLを書かずにRDBを使うには
|
77
|
+
|
78
|
+
= ((*Ruby*))で書けばいいじゃない
|
79
|
+
|
80
|
+
= そこでSequel
|
81
|
+
|
82
|
+
= テーブルの操作
|
83
|
+
|
84
|
+
SELECT col2 ((*FROM tbl*)) WHERE col1=1
|
85
|
+
|
86
|
+
# image
|
87
|
+
# src = table1.png
|
88
|
+
# relative_height = 100
|
89
|
+
|
90
|
+
= 条件で行の絞り込み
|
91
|
+
|
92
|
+
SELECT col2 FROM tbl ((*WHERE col1=1*))
|
93
|
+
|
94
|
+
# image
|
95
|
+
# src = table2.png
|
96
|
+
# relative_height = 100
|
97
|
+
|
98
|
+
= その中の列を選択
|
99
|
+
|
100
|
+
((*SELECT col2*)) FROM tbl WHERE col1=1
|
101
|
+
|
102
|
+
# image
|
103
|
+
# src = table3.png
|
104
|
+
# relative_height = 100
|
105
|
+
|
106
|
+
= Sequelで
|
107
|
+
|
108
|
+
= Sequel 初期化
|
109
|
+
|
110
|
+
# enscript ruby
|
111
|
+
require 'sequel'
|
112
|
+
DB = Sequel.connect(
|
113
|
+
'mysql://user:passwd@hostname:3306/dbname'
|
114
|
+
)
|
115
|
+
|
116
|
+
= コマンドラインから
|
117
|
+
|
118
|
+
% sequel mysql://user:passwd@hostname:3306/dbname
|
119
|
+
Your database is stored in DB...
|
120
|
+
irb(main):001:0>
|
121
|
+
|
122
|
+
= テーブルの操作
|
123
|
+
|
124
|
+
((*DB[:tbl]*))
|
125
|
+
|
126
|
+
# image
|
127
|
+
# src = table1.png
|
128
|
+
# relative_height = 100
|
129
|
+
|
130
|
+
= 条件で行の絞り込み
|
131
|
+
|
132
|
+
DB[:tbl].((*where(col1: 1)*))
|
133
|
+
|
134
|
+
# image
|
135
|
+
# src = table2.png
|
136
|
+
# relative_height = 100
|
137
|
+
|
138
|
+
= その中の列を選択
|
139
|
+
|
140
|
+
DB[:tbl].where(col1: 1).((*select(:col2)*))
|
141
|
+
|
142
|
+
# image
|
143
|
+
# src = table3.png
|
144
|
+
# relative_height = 100
|
145
|
+
|
146
|
+
= とても自然!
|
147
|
+
|
148
|
+
= Select/Update/Delete/Insert
|
149
|
+
|
150
|
+
# enscript ruby
|
151
|
+
DB[:tbl].where(col1: 1).select(:col2)
|
152
|
+
|
153
|
+
DB[:tbl].where(col1: 1).update(col2: 3)
|
154
|
+
|
155
|
+
DB[:tbl].where(col1: 1).delete
|
156
|
+
|
157
|
+
DB[:tbl].insert(col1: 1, col2: 2)
|
158
|
+
|
159
|
+
= Select は実行遅延
|
160
|
+
|
161
|
+
# enscript ruby
|
162
|
+
|
163
|
+
ds = DB[:tbl].where(col1: 1).select(:col2)
|
164
|
+
# まだ実行されない
|
165
|
+
ds.first
|
166
|
+
# ここで実行される
|
167
|
+
#=> {:col2=>'value'}
|
168
|
+
|
169
|
+
= 関数
|
170
|
+
|
171
|
+
# enscript ruby
|
172
|
+
|
173
|
+
DB[:tbl].select(Sequel.function(:length, :col))
|
174
|
+
#=> SELECT length(col) FROM tbl
|
175
|
+
|
176
|
+
DB[:tbl].select{length(col)}
|
177
|
+
#=> SELECT length(col) FROM tbl
|
178
|
+
|
179
|
+
= 集約関数
|
180
|
+
|
181
|
+
# enscript ruby
|
182
|
+
|
183
|
+
DB[:tbl].count
|
184
|
+
#=> SELECT COUNT(*) FROM tbl
|
185
|
+
|
186
|
+
= 条件いろいろ
|
187
|
+
|
188
|
+
= 比較
|
189
|
+
|
190
|
+
# enscript ruby
|
191
|
+
where(id: 123)
|
192
|
+
#=> WHERE id=123
|
193
|
+
|
194
|
+
= 配列
|
195
|
+
|
196
|
+
# enscript ruby
|
197
|
+
where(id: [123, 456])
|
198
|
+
#=> WHERE id IN (123, 456)
|
199
|
+
|
200
|
+
= Range
|
201
|
+
|
202
|
+
# enscript ruby
|
203
|
+
where(id: 123..456)
|
204
|
+
#=> WHERE id >= 123 AND id <= 456
|
205
|
+
|
206
|
+
= nil, true, false
|
207
|
+
|
208
|
+
# enscript ruby
|
209
|
+
where(id: nil)
|
210
|
+
#=> WHERE id is NULL
|
211
|
+
|
212
|
+
= データセット
|
213
|
+
|
214
|
+
# enscript ruby
|
215
|
+
where(id: DB[:tbl2].select(:id))
|
216
|
+
#=> WHERE id IN (SELECT id FROM tbl2)
|
217
|
+
|
218
|
+
= 正規表現
|
219
|
+
|
220
|
+
# enscript ruby
|
221
|
+
where(id: /abc/)
|
222
|
+
#=> WHERE id REGEXP BINARY 'abc'
|
223
|
+
|
224
|
+
where(id: /abc/i)
|
225
|
+
#=> WHERE id REGEXP 'abc'
|
226
|
+
|
227
|
+
= 複数
|
228
|
+
|
229
|
+
# enscript ruby
|
230
|
+
where(id: 123, name:'hoge')
|
231
|
+
#=> WHERE id=123 AND name='hoge'
|
232
|
+
|
233
|
+
= 不等号
|
234
|
+
|
235
|
+
# enscript ruby
|
236
|
+
where(Sequel.expr(:id) > 123)
|
237
|
+
#=> WHERE id > 123
|
238
|
+
|
239
|
+
where{id > 123}
|
240
|
+
#=> WHERE id > 123
|
241
|
+
|
242
|
+
= JOIN
|
243
|
+
|
244
|
+
= JOIN
|
245
|
+
|
246
|
+
# enscript ruby
|
247
|
+
|
248
|
+
DB[:posts].left_join(:users, :id=>:users_id)
|
249
|
+
#=> SELECT * FROM posts LEFT JOIN users
|
250
|
+
# ON users.id=posts.users_id
|
251
|
+
|
252
|
+
= 自己結合
|
253
|
+
|
254
|
+
# enscript ruby
|
255
|
+
|
256
|
+
DB[:hoge].left_join(:hoge.as(:fuga), :x=>:y).
|
257
|
+
select(:hoge__id)
|
258
|
+
#=> SELECT hoge.id FROM hoge
|
259
|
+
# LEFT JOIN hoge AS fuga
|
260
|
+
# ON fuga.x=hoge.y
|
261
|
+
|
262
|
+
= FAQ
|
263
|
+
|
264
|
+
= Q. ActiveRecord じゃだめなん?
|
265
|
+
|
266
|
+
= A1. Active Record は RDB にデータ置いて読み書きしてるだけで、RDB として使ってるわけじゃないんでちょっと…
|
267
|
+
|
268
|
+
= A2. ActiveRecord は\nRuby/MySQL で動かないし…\n\n(('note:そういえば activerecord-ruby_mysql-adapter ってのを作ったような気もする'))
|
269
|
+
|
270
|
+
= A3. でも Active Record 便利ですよね。Sequel でも使えるよ!
|
271
|
+
|
272
|
+
= Sequel::Model
|
273
|
+
|
274
|
+
# enscript ruby
|
275
|
+
class User < Sequel::Model
|
276
|
+
plugin :validation_helpers
|
277
|
+
|
278
|
+
def validate
|
279
|
+
super
|
280
|
+
validates_unique :loginid
|
281
|
+
validates_presence :name
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
= まとめ
|
286
|
+
|
287
|
+
* SQL の構文はイケてない(('note:(個人の感想です)'))
|
288
|
+
* Sequel で Ruby っぽくクエリを書ける
|
289
|
+
* Sequel は Active Record パターンも使える
|
290
|
+
* SQL を「シークエル」と発音する人は混乱するがいいさ
|
data/table1.png
ADDED
Binary file
|
data/table2.png
ADDED
Binary file
|
data/table3.png
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-tommy-sequel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2013.06.02
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- とみたまさひろ
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-06-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rabbit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.2
|
27
|
+
description: Sequel を使って Ruby でクエリを書こう
|
28
|
+
email:
|
29
|
+
- tommy@tmtm.org
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- .rabbit
|
35
|
+
- config.yaml
|
36
|
+
- Rakefile
|
37
|
+
- README.rd
|
38
|
+
- table2.png
|
39
|
+
- table1.png
|
40
|
+
- table3.png
|
41
|
+
- OSS貢献者賞.jpg
|
42
|
+
- sequel.rab
|
43
|
+
- pdf/sequel-sequel.pdf
|
44
|
+
homepage: http://slide.rabbit-shocker.org/authors/tommy/sequel/
|
45
|
+
licenses: []
|
46
|
+
metadata: {}
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 2.0.0
|
64
|
+
signing_key:
|
65
|
+
specification_version: 4
|
66
|
+
summary: Sequelのすすめ
|
67
|
+
test_files: []
|