| 1 | SQL::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 | ---- |
|---|
| 25 | SQL |
|---|
| 26 | >|| |
|---|
| 27 | SELECT |
|---|
| 28 | user.*, address.* |
|---|
| 29 | FROM |
|---|
| 30 | user, address |
|---|
| 31 | WHERE |
|---|
| 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 | ---- |
|---|
| 39 | DBIx::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 | ---- |
|---|
| 55 | SQLAlchemy |
|---|
| 56 | >|| |
|---|
| 57 | select([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 | ---- |
|---|
| 61 | SQL::Declare |
|---|
| 62 | >|| |
|---|
| 63 | Select([$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 | ---- |
|---|
| 79 | SQL::Abstract |
|---|
| 80 | >|| |
|---|
| 81 | 'user.name' => \'user.email' |
|---|
| 82 | ||< |
|---|
| 83 | |
|---|
| 84 | SQL::Declare |
|---|
| 85 | >|| |
|---|
| 86 | $user->c->name == $user->c->email |
|---|
| 87 | ||< |
|---|
| 88 | ---- |
|---|
| 89 | SQL::Abstract |
|---|
| 90 | >|| |
|---|
| 91 | 'user.email' => \'IS NULL' |
|---|
| 92 | ||< |
|---|
| 93 | |
|---|
| 94 | SQL::Declare |
|---|
| 95 | >|| |
|---|
| 96 | $user->c->email == Null |
|---|
| 97 | ||< |
|---|
| 98 | ---- |
|---|
| 99 | SQL::Abstract |
|---|
| 100 | >|| |
|---|
| 101 | 'user.age' => { '>' => 20 } |
|---|
| 102 | ||< |
|---|
| 103 | |
|---|
| 104 | SQL::Declare |
|---|
| 105 | >|| |
|---|
| 106 | $user->c->age > 20 |
|---|
| 107 | ||< |
|---|
| 108 | ---- |
|---|
| 109 | schema meta data |
|---|
| 110 | >|| |
|---|
| 111 | my $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 | ---- |
|---|
| 125 | use overloadで比較演算子をオーバーロード |
|---|
| 126 | >|| |
|---|
| 127 | use 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> |
|---|