root/docs/kan/080127-sql-declare/main.txt

Revision 5733, 2.6 kB (checked in by kan, 4 years ago)

import SQL::Declare presen in SoozyCon?#4

Line 
1SQL::Declare
2
3<div style="text-align: right">
4ふしはらかん
5</div>
6----
7*PerlのOR mapper色々
8- DBIx::Class
9- Class::DBI
10- Data::ObjectDriver
11- Jifty::DBI
12- etc
13----
14*DBIx::Classの不満点
15- 複雑な検索条件がカオス
16- キャッシュがめんどくさい
17- 拡張やhookが曲者(Class::C3)
18----
19ためしに作ってみよう
20----
21*SQLAlchemy
22- python のOR mapper
23- SQLの記述をpythonのcodeっぽく書く機能がある
24----
25SQL
26>||
27SELECT
28    user.*, address.*
29FROM
30    user, address
31WHERE
32    user.name LIKE 'j%'            AND
33    user.id   =    address.user_id AND
34    (
35        address.email_address = 'foo@example.com' OR
36        address.email_address = 'bar@example.com'
37    )
38----
39DBIx::Class(SQL::Abstract)
40>||
41({
42    'user.name' => { 'LIKE' => 'j%' },
43    'user.id'    => 'address.user_id',
44    -or => [
45        'address.email_address' => 'foo@example.com',
46        'address.email_address' => 'bar@example.com',
47    ],
48},
49{
50    form => [qw/user address/],
51    select => [qw/user.* address.*/],
52}
53||<
54----
55SQLAlchemy
56>||
57select([user, address], and_(user.c.name.like('j%'), user.c.id==address.c.user_id,
58    or_(address.c.email_address=='foo@example.com', address.c.email_address=='bar@example.com'))
59||<
60----
61SQL::Declare
62>||
63Select([$user,$address],
64    and_(
65        $user->c->name->like('j%'),
66        $user->c->id==$address->c->user_id,
67        or_(
68            $address->email_address=='foo@example.com',
69            $address->email_address=='bar@example.com'
70        ),
71    ),
72);
73||<
74----
75*利点
76- 自然に書ける部分が増える
77- schemaのmetadataと組み合わせてチェックとか
78----
79SQL::Abstract
80>||
81'user.name' => \'user.email'
82||<
83
84SQL::Declare
85>||
86$user->c->name == $user->c->email
87||<
88----
89SQL::Abstract
90>||
91'user.email' => \'IS NULL'
92||<
93
94SQL::Declare
95>||
96$user->c->email == Null
97||<
98----
99SQL::Abstract
100>||
101'user.age' => { '>' => 20 }
102||<
103
104SQL::Declare
105>||
106$user->c->age > 20
107||<
108----
109schema meta data
110>||
111my $users = Table(user => [
112    Column('id',    'integer',     'auto_incerement'),
113    Column('name',  'string'),
114    Column('email', 'string'),
115    Column('birthday', 'date'),
116]);
117
118$user->c->id==10
119 # => user.id = 10
120
121$user->c->name=='kan'
122 # => user.name IS 'kan'
123||<
124----
125use overloadで比較演算子をオーバーロード
126>||
127use overload(
128    '>' => sub { $_[0]->op('>', $_[1]) },
129    ...
130);
131----
132||<
133*今後の展開
134- joinなどに対応
135- OR mapper部分も作ってみる
136||<
137----
138ご清聴ありがとうございました
139
140<a href="http://coderepos.org/share/browser/lang/perl/SQL-Declare">http://coderepos.org/share/browser/lang/perl/SQL-Declare</a>
Note: See TracBrowser for help on using the browser.