Skip to main content
Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
EN
Upload
Download free for 30 days
Sign in
Uploaded by
kwatch
60,299 views
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
(PgDay2012発表資料) SQLにとって、なぜO/Rマッパーが重要かを説明した資料です。
Technology
◦
Read more
194
Save
Share
Embed
1
/ 46
2
/ 46
3
/ 46
Most read
4
/ 46
5
/ 46
6
/ 46
7
/ 46
Most read
8
/ 46
9
/ 46
10
/ 46
11
/ 46
12
/ 46
Most read
13
/ 46
14
/ 46
15
/ 46
16
/ 46
17
/ 46
18
/ 46
19
/ 46
20
/ 46
More Related Content
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
28 slides
29.1K views
PDF
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
24 slides
197.2K views
PPTX
イベント駆動プログラミングとI/O多重化
by
Gosuke Miyashita
78 slides
16K views
PDF
Cognitive Complexity でコードの複雑さを定量的に計測しよう
by
Shuto Suzuki
31 slides
12.2K views
PPTX
さくっと理解するSpring bootの仕組み
by
Takeshi Ogawa
38 slides
66.4K views
PDF
MySQLで論理削除と正しく付き合う方法
by
yoku0825
34 slides
81.4K views
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
45 slides
174.7K views
PPTX
テストコードの DRY と DAMP
by
Yusuke Kagata
11 slides
4.5K views
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
28 slides
29.1K views
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
24 slides
197.2K views
イベント駆動プログラミングとI/O多重化
by
Gosuke Miyashita
78 slides
16K views
Cognitive Complexity でコードの複雑さを定量的に計測しよう
by
Shuto Suzuki
31 slides
12.2K views
さくっと理解するSpring bootの仕組み
by
Takeshi Ogawa
38 slides
66.4K views
MySQLで論理削除と正しく付き合う方法
by
yoku0825
34 slides
81.4K views
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
45 slides
174.7K views
テストコードの DRY と DAMP
by
Yusuke Kagata
11 slides
4.5K views
What's hot
PDF
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
by
Jun-ichi Sakamoto
64 slides
23.8K views
PDF
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
16 slides
40.7K views
PPTX
初心者向けMongoDBのキホン!
by
Tetsutaro Watanabe
21 slides
53.4K views
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
by
Takuto Wada
40 slides
17.6K views
PPTX
イベント・ソーシングを知る
by
Shuhei Fujita
33 slides
31.8K views
PPTX
Dockerからcontainerdへの移行
by
Akihiro Suda
36 slides
10.8K views
PDF
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
28 slides
4.5K views
PDF
オブジェクト指向できていますか?
by
Moriharu Ohzu
129 slides
243.2K views
PDF
フロー効率性とリソース効率性について #xpjug
by
Itsuki Kuroda
62 slides
123.1K views
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
53 slides
11.7K views
PDF
組織にテストを書く文化を根付かせる戦略と戦術
by
Takuto Wada
33 slides
77.9K views
PPTX
WayOfNoTrouble.pptx
by
Daisuke Yamazaki
25 slides
3.7K views
PPTX
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
77 slides
54.9K views
ODP
どこに何を書くのか?
by
pospome
40 slides
7.8K views
PDF
ドメイン駆動設計 本格入門
by
増田 亨
139 slides
46.9K views
PDF
Where狙いのキー、order by狙いのキー
by
yoku0825
109 slides
44.9K views
PDF
O/Rマッパーによるトラブルを未然に防ぐ
by
kwatch
61 slides
49K views
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
by
Mikiya Okuno
59 slides
22.5K views
PPTX
async/await のしくみ
by
信之 岩永
41 slides
20.9K views
PDF
実践 NestJS
by
Ayumi Goto
189 slides
1.8K views
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
by
Jun-ichi Sakamoto
64 slides
23.8K views
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
16 slides
40.7K views
初心者向けMongoDBのキホン!
by
Tetsutaro Watanabe
21 slides
53.4K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
by
Takuto Wada
40 slides
17.6K views
イベント・ソーシングを知る
by
Shuhei Fujita
33 slides
31.8K views
Dockerからcontainerdへの移行
by
Akihiro Suda
36 slides
10.8K views
ブルックスのいう銀の弾丸とは何か?
by
Yoshitaka Kawashima
28 slides
4.5K views
オブジェクト指向できていますか?
by
Moriharu Ohzu
129 slides
243.2K views
フロー効率性とリソース効率性について #xpjug
by
Itsuki Kuroda
62 slides
123.1K views
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
53 slides
11.7K views
組織にテストを書く文化を根付かせる戦略と戦術
by
Takuto Wada
33 slides
77.9K views
WayOfNoTrouble.pptx
by
Daisuke Yamazaki
25 slides
3.7K views
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
77 slides
54.9K views
どこに何を書くのか?
by
pospome
40 slides
7.8K views
ドメイン駆動設計 本格入門
by
増田 亨
139 slides
46.9K views
Where狙いのキー、order by狙いのキー
by
yoku0825
109 slides
44.9K views
O/Rマッパーによるトラブルを未然に防ぐ
by
kwatch
61 slides
49K views
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
by
Mikiya Okuno
59 slides
22.5K views
async/await のしくみ
by
信之 岩永
41 slides
20.9K views
実践 NestJS
by
Ayumi Goto
189 slides
1.8K views
Viewers also liked
PDF
よろしい、ならばMicro-ORMだ
by
Narami Kiyokura
60 slides
8.5K views
PDF
テスト自動化の現場から~落とし穴に気を付けよう~
by
Satsuki Urayama
65 slides
5.9K views
PDF
自動テストの誤解とアンチパターン in 楽天 Tech Talk
by
kyon mm
70 slides
31.9K views
PDF
3000社の業務データ絞り込みを支える技術
by
Ryo Mitoma
72 slides
12.8K views
PPTX
WalB: Real-time and Incremental Backup System for Block Devices
by
uchan_nos
37 slides
5.3K views
PDF
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
by
Jumpei Miyata
92 slides
7.5K views
よろしい、ならばMicro-ORMだ
by
Narami Kiyokura
60 slides
8.5K views
テスト自動化の現場から~落とし穴に気を付けよう~
by
Satsuki Urayama
65 slides
5.9K views
自動テストの誤解とアンチパターン in 楽天 Tech Talk
by
kyon mm
70 slides
31.9K views
3000社の業務データ絞り込みを支える技術
by
Ryo Mitoma
72 slides
12.8K views
WalB: Real-time and Incremental Backup System for Block Devices
by
uchan_nos
37 slides
5.3K views
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
by
Jumpei Miyata
92 slides
7.5K views
Similar to SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
PDF
Active record query interface
by
Tomoya Kawanishi
40 slides
1.1K views
KEY
実録!Railsのはまりポイント10選
by
Drecom Co., Ltd.
53 slides
24.6K views
PDF
Sql基礎の基礎
by
Satomi Tsujita
31 slides
6.1K views
PDF
Ruby on Rails 入門
by
Yasuko Ohba
91 slides
11.3K views
PPT
Start!! Ruby
by
mitim
44 slides
1.9K views
PDF
2019年度若手技術者向け講座 実践SQL
by
keki3
115 slides
333 views
PDF
Tokyo Rubykaigi 01 t-wada
by
Takuto Wada
85 slides
3K views
PPTX
第3回輪講
by
mh_amako
47 slides
417 views
PDF
魂のコーディング
by
Daisuke Tasaki
28 slides
2.3K views
PDF
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter)
by
AzareaCluster
44 slides
1.3K views
PPTX
Ruby講座第二回
by
mitsunaga
30 slides
528 views
PDF
名古屋Ruby会議02 LT:Ruby中級への道
by
Shigeru UCHIYAMA
65 slides
3.2K views
PDF
Rubyプログラミング教育に対する取り組みと事例紹介
by
Yasushi Ishikawa
29 slides
1.4K views
PDF
アジャイル開発を可能にするEA
by
Kent Ishizawa
14 slides
3.9K views
PDF
Database smells
by
Mikiya Okuno
32 slides
4.9K views
PDF
RDB入門 ~アプリケーション開発者が陥りやすいDB開発の落とし穴~
by
nisobe58
27 slides
3.8K views
PDF
ドメイン駆動設計 の 実践 Part3 DDD
by
増田 亨
23 slides
9.2K views
KEY
activerecord-turntable
by
Drecom Co., Ltd.
42 slides
5K views
PPT
分散KVSのデータモデリング
by
Tatsunori Matoba
13 slides
4.3K views
PPTX
Qlik ReplicateにおけるExpression Builderの利用方法
by
QlikPresalesJapan
40 slides
2.1K views
Active record query interface
by
Tomoya Kawanishi
40 slides
1.1K views
実録!Railsのはまりポイント10選
by
Drecom Co., Ltd.
53 slides
24.6K views
Sql基礎の基礎
by
Satomi Tsujita
31 slides
6.1K views
Ruby on Rails 入門
by
Yasuko Ohba
91 slides
11.3K views
Start!! Ruby
by
mitim
44 slides
1.9K views
2019年度若手技術者向け講座 実践SQL
by
keki3
115 slides
333 views
Tokyo Rubykaigi 01 t-wada
by
Takuto Wada
85 slides
3K views
第3回輪講
by
mh_amako
47 slides
417 views
魂のコーディング
by
Daisuke Tasaki
28 slides
2.3K views
AZAREA-Cluster (Hadoop Conference Japan 2013 Winter)
by
AzareaCluster
44 slides
1.3K views
Ruby講座第二回
by
mitsunaga
30 slides
528 views
名古屋Ruby会議02 LT:Ruby中級への道
by
Shigeru UCHIYAMA
65 slides
3.2K views
Rubyプログラミング教育に対する取り組みと事例紹介
by
Yasushi Ishikawa
29 slides
1.4K views
アジャイル開発を可能にするEA
by
Kent Ishizawa
14 slides
3.9K views
Database smells
by
Mikiya Okuno
32 slides
4.9K views
RDB入門 ~アプリケーション開発者が陥りやすいDB開発の落とし穴~
by
nisobe58
27 slides
3.8K views
ドメイン駆動設計 の 実践 Part3 DDD
by
増田 亨
23 slides
9.2K views
activerecord-turntable
by
Drecom Co., Ltd.
42 slides
5K views
分散KVSのデータモデリング
by
Tatsunori Matoba
13 slides
4.3K views
Qlik ReplicateにおけるExpression Builderの利用方法
by
QlikPresalesJapan
40 slides
2.1K views
More from kwatch
PDF
How to make the fastest Router in Python
by
kwatch
66 slides
5K views
PDF
Migr8.rb チュートリアル
by
kwatch
64 slides
3.2K views
PDF
なんでもID
by
kwatch
42 slides
1.4K views
PDF
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
by
kwatch
20 slides
5.2K views
PDF
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
by
kwatch
58 slides
34.4K views
PDF
正規表現リテラルは本当に必要なのか?
by
kwatch
61 slides
16.3K views
PDF
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
by
kwatch
1 slide
7.6K views
PDF
DBスキーマもバージョン管理したい!
by
kwatch
37 slides
58.4K views
PDF
PHPとJavaScriptにおけるオブジェクト指向を比較する
by
kwatch
59 slides
6.9K views
PDF
Fantastic DSL in Python
by
kwatch
61 slides
13.1K views
PDF
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
by
kwatch
83 slides
4.2K views
PDF
PHP5.5新機能「ジェネレータ」初心者入門
by
kwatch
63 slides
22.4K views
PDF
Pretty Good Branch Strategy for Git/Mercurial
by
kwatch
25 slides
1.9K views
PDF
Oktest - a new style testing library for Python -
by
kwatch
27 slides
3.3K views
PDF
文字列結合のベンチマークをいろんな処理系でやってみた
by
kwatch
16 slides
6.9K views
PDF
I have something to say about the buzz word "From Java to Ruby"
by
kwatch
12 slides
1.3K views
PDF
Cより速いRubyプログラム
by
kwatch
56 slides
5.3K views
PDF
Javaより速いLL用テンプレートエンジン
by
kwatch
51 slides
4.1K views
PDF
Underlaying Technology of Modern O/R Mapper
by
kwatch
62 slides
3.7K views
PDF
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
by
kwatch
39 slides
6.9K views
How to make the fastest Router in Python
by
kwatch
66 slides
5K views
Migr8.rb チュートリアル
by
kwatch
64 slides
3.2K views
なんでもID
by
kwatch
42 slides
1.4K views
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
by
kwatch
20 slides
5.2K views
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
by
kwatch
58 slides
34.4K views
正規表現リテラルは本当に必要なのか?
by
kwatch
61 slides
16.3K views
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
by
kwatch
1 slide
7.6K views
DBスキーマもバージョン管理したい!
by
kwatch
37 slides
58.4K views
PHPとJavaScriptにおけるオブジェクト指向を比較する
by
kwatch
59 slides
6.9K views
Fantastic DSL in Python
by
kwatch
61 slides
13.1K views
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
by
kwatch
83 slides
4.2K views
PHP5.5新機能「ジェネレータ」初心者入門
by
kwatch
63 slides
22.4K views
Pretty Good Branch Strategy for Git/Mercurial
by
kwatch
25 slides
1.9K views
Oktest - a new style testing library for Python -
by
kwatch
27 slides
3.3K views
文字列結合のベンチマークをいろんな処理系でやってみた
by
kwatch
16 slides
6.9K views
I have something to say about the buzz word "From Java to Ruby"
by
kwatch
12 slides
1.3K views
Cより速いRubyプログラム
by
kwatch
56 slides
5.3K views
Javaより速いLL用テンプレートエンジン
by
kwatch
51 slides
4.1K views
Underlaying Technology of Modern O/R Mapper
by
kwatch
62 slides
3.7K views
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
by
kwatch
39 slides
6.9K views
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
1.
PgDay2012 LightningTalk SQL上級者にこそ知って欲しい なぜ O/Rマッパー
が重要か? makoto kuwata <kwa@kuwata-lab.com> http://www.kuwata-lab.com/
2.
問:次のSQLは 何が問題でしょう? copyright© 2012
kuwata-lab.com all rights reserved
3.
SQL -- 販売成績上位10コを抽出 select *
from sales where deleted = false order by amount desc limit 10 文法的には正しいけど… copyright© 2012 kuwata-lab.com all rights reserved
4.
話は変わって、 他のプログラミング言語 copyright©
2012 kuwata-lab.com all rights reserved
5.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs end copyright© 2012 kuwata-lab.com all rights reserved
6.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] select from相当 return xs end copyright© 2012 kuwata-lab.com all rights reserved
7.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs where相当 end copyright© 2012 kuwata-lab.com all rights reserved
8.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs order by相当 end copyright© 2012 kuwata-lab.com all rights reserved
9.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs limit相当 end copyright© 2012 kuwata-lab.com all rights reserved
10.
Ruby ## 販売実績上位Nコを抽出 def sales_top(n,
rows) xs = rows.map {|row| Sale.new(*row) } xs = xs.select {|x| ! x.deleted_at } xs = xs.sort_by {|x| - x.amount } xs = xs[0, 10] return xs end 1つの関数でいろんな ことをやりすぎている copyright© 2012 kuwata-lab.com all rights reserved
11.
複数の関数に分解 (リファクタリング) copyright© 2012
kuwata-lab.com all rights reserved
12.
Ruby def to_sales(rows)
rows.map {|row| Sale.new(*row) } end def active(sales) sales.select {|x| ! x.deleted_at } end def top(n, sales) sales = sales.sort_by {|x| - x.amount } return sales[0, 10] end copyright© 2012 kuwata-lab.com all rights reserved
13.
Ruby ## 使い方 def sales_top(n,
rows) return top(n, active(to_sales(rows))) end 分解した関数を 組み合わせる copyright© 2012 kuwata-lab.com all rights reserved
14.
専用のクラスを定義 (オブジェクト指向) copyright©
2012 kuwata-lab.com all rights reserved
15.
Ruby clas Sales
def initialize(rows) @all = rows.map {|row| Sales.new(*row) } end attr_reader :all def active @all = @all.select {|x| ! x.deleted } return self end def top(n) @all = @all.sort_by {|x| - x.amount } @all = @all[0, n] return self end end copyright© 2012 kuwata-lab.com all rights reserved
16.
Ruby ## 使い方 Sales.new(rows).active().top(10).all()
分解したメソッドを 組み合わせる copyright© 2012 kuwata-lab.com all rights reserved
17.
プログラミング言語が 持っている基本機能 copyright©
2012 kuwata-lab.com all rights reserved
18.
• 「全体」 「部分」
を に分解する機能 • 「部分」 「全体」 から を構築する機能 • 「部分」に名前をつけて抽象化する機能 copyright© 2012 kuwata-lab.com all rights reserved
19.
改めて、次のSQLは 何が問題でしょう? copyright© 2012
kuwata-lab.com all rights reserved
20.
SQL -- 販売成績上位10コを抽出 select *
from sales where deleted = false order by amount desc limit 10 copyright© 2012 kuwata-lab.com all rights reserved
21.
SQLは、分解・構築・ 抽象化の機能が弱っちい! copyright©
2012 kuwata-lab.com all rights reserved
22.
そこで O/R Mapper!!
copyright© 2012 kuwata-lab.com all rights reserved
23.
ORMを使うことで、 •SQLを小さい部品に分解 • 部品からSQL全体を構築 • 部品に名前をつけて抽象化 できるようになる!
copyright© 2012 kuwata-lab.com all rights reserved
24.
サンプルコード: ActiveRecord (Rails3)
copyright© 2012 kuwata-lab.com all rights reserved
25.
Ruby
where deleted = false class Sales < ActiveReocrd::Base に相当する「部分」 named_scope :active, {:conditions=>"deleted = false"} named_scope :top, lambda do |n| {:order=>"amount desc", :limit=>n} end order by amount desc limit n end に相当する「部分」 copyright© 2012 kuwata-lab.com all rights reserved
26.
「部分」を組み合わせて
Ruby 「全体」を構築 Sales.active().top(10).all() ## これは ## select * from sales ## where deleted = false ## order by amount desc limit 10 ## を生成して実行する ※(2012-12-19) 「と同じ」を「を生成して実行する」に修正 copyright© 2012 kuwata-lab.com all rights reserved
27.
サンプルコード: DataMapper copyright© 2012
kuwata-lab.com all rights reserved
28.
Ruby class Sales
where deleted = false include DataMapper::Resource に相当する「部分」 def self.active where(:deleted => false) end def self.top(n) order(:amount.desc).limit(n) end end order by amount desc limit n に相当する「部分」 copyright© 2012 kuwata-lab.com all rights reserved
29.
「部分」を組み合わせて
Ruby 「全体」を構築 Sales.active().top(10).all() ## これも ## select * from sales ## where deleted = false ## order by amount desc limit 10 ## を生成して実行する ※(2012-12-19) 「と同じ」を「を生成して実行する」に修正 copyright© 2012 kuwata-lab.com all rights reserved
30.
別のサンプル: 副問い合わせ copyright© 2012 kuwata-lab.com
all rights reserved
31.
SQL -- 年齢が20歳の社員が所属する部署一覧 select *
from departments where id in (select dept_id from employees where age = 20) order by name SQLに「部品化」の機能が ないことを示す典型例 ※(2012-12-13) "select id" を "select dept_id" に修正 copyright© 2012 kuwata-lab.com all rights reserved
32.
サンプルコード:
Sequel copyright© 2012 kuwata-lab.com all rights reserved
33.
副問い合わせを切り出して
名前を付ける Ruby dept_ids = Employee.select(:dept_id) .filter(:age=>20) Department.filter(:id=>dept_ids).all() SQL構築が簡潔になる SQL select * from departments where id in (select dept_id from employees where age = 20) copyright© 2012 kuwata-lab.com all rights reserved
34.
Ruby dept_ids = Employee.select(:dept_id)
.filter(:age=>20) Department.filter(:id=>dept_ids).all() Budget.filter(:dept_id=>dept_ids).all() 部品化した副問い合わせを複数の SQLで共用できる(with句より便利) copyright© 2012 kuwata-lab.com all rights reserved
35.
別のサンプル: 重複した式 copyright© 2012 kuwata-lab.com
all rights reserved
36.
SQL -- 誕生日をもとに年齢を計算 select date_part('year',
age(birth)) as age, count(*) from users where date_part('year', age(birth)) < 20 group by date_part('year', age(birth)) order by age 同じ式が重複して出現 copyright© 2012 kuwata-lab.com all rights reserved
37.
サンプルコード: SQLAlchemy copyright© 2012
kuwata-lab.com all rights reserved
38.
年齢の計算式を表す構文木を作り、
Python from sqlalchemy.sql import func as fn age = fn.date_part('year', fn.age(User.birth)) rows = DBSession .query(age, fn.count('*')) .select_from(User) .filter(age < 20) .group_by(age) .order_by(age) .all() それを複数箇所で使用できる copyright© 2012 kuwata-lab.com all rights reserved
39.
つまり copyright© 2012 kuwata-lab.com
all rights reserved
40.
• SQLには部品化の機能がない →
SQLが長くなる・わかりにくい → 複数のSQLで要素の重複が多い • ORMはSQL要素の部品化ができる → SQL構築が簡潔・わかりやすい → 複数のSQLで部品を共用できる copyright© 2012 kuwata-lab.com all rights reserved
41.
• SQLには部品化の機能がない →
SQLが長くなる・わかりにくい → 複数のSQLで要素の重複が多い • ORMはSQL要素の部品化ができる → SQL構築が簡潔・わかりやすい → 複数のSQLで部品を共用できる copyright© 2012 kuwata-lab.com all rights reserved
42.
たとえるなら copyright© 2012 kuwata-lab.com
all rights reserved
43.
まだ進化の途中な
高水準へと進化 ので暖かい目を! Lisp, Ruby Modern ORM C, Pascal JDBC, DBI Assembler SQL 低水準から copyright© 2012 kuwata-lab.com all rights reserved
44.
まとめ copyright© 2012 kuwata-lab.com
all rights reserved
45.
• 一般のプログラミング言語には 「分解」「構築」「抽象化」
の機能がある • SQLはそれらが弱っちい • モダンなORMなら、それらの機能 をSQLに提供できる ORMはSQLの高水準言語 or DSL! copyright© 2012 kuwata-lab.com all rights reserved
46.
おしまい copyright© 2012 kuwata-lab.com
all rights reserved