Newer Older
669 lines | 22.726kb
added experimental expand me...
yuki-kimoto authored on 2010-10-20
1
=encoding utf8
2

            
3
=head1 名前
4

            
5
DBIx::Custom::Guides::Ja - DBIx::Customの日本語のガイド
6

            
7
=head1 ガイド
8

            
9
L<DBIx::Custom>はデータベースへのクエリの発行を簡単に行うための
10
クラスです。L<DBIx::Class>やL<DBIx::Simple>と同じように
11
L<DBI>のラッパクラスになっています。
12

            
13
L<DBIx::Custom>はO/Rマッパーではありません。O/Rマッパーは
14
便利ですが、O/Rマッパのたくさんの文法を覚える必要があります。
15
また、O/Rマッパによって生成されたSQLは非効率なことがあり、
16
生のSQLを発行しなければならないこともあります。
17

            
18
L<DBIx::Custom>はO/RマッパとL<DBI>の中間に位置するモジュールです。
19
L<DBIx::Custom>は柔軟なハッシュパラメータバインディングとフィルタリング
20
のシステムを提供します。またSQLを簡単に実行するための、
21
C<insert()>, C<update()>, C<delete()>,C<select()>などの
22
シュガーメソッドも提供します。
23

            
24
L<DBIx::Custom>はSQLを尊重します。SQLはとても複雑で、美しくはありません。
25
けれども、SQLはデファクトスタンダードな技術です。
26
ですので、データベースを学ぶすべての人はSQLを知っています。
27
あなたがすでにSQLを知っているなら、L<DBIx::Custom>を使って
28
何かを行うために覚えることはとても少ないです。
29

            
30
では使い方を解説します。
31

            
32
=head2 1. データベースへの接続
33

            
34
L<DBIx::Custom>オブジェクトを生成し、データベースに接続するには
35
C<connect()>メソッドを使用します。
36

            
37
    use DBIx::Custom;
38
    my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=dbname",
39
                                    user => 'ken', password => '!LFKD%$&');
40

            
41
データベースがSQLiteであれば、代わりにL<DBIx::Custom::SQLite>を使うと
42
データベースへの接続が簡単です。
43

            
44
    use DBIx::Custom::SQLite;
45
    my $dbi = DBIx::Custom::SQLite->connect(database => 'dbname');
46

            
47
データベースがMySQLであれば、代わりにL<DBIx::Custom::MySQL>を使うと
48
データベースへの接続が簡単です。
49

            
50
    use DBIx::Custom::MySQL;
51
    my $dbi = DBIx::Custom::MySQL->connect(
52
        database => 'dbname',
53
        user     => 'ken',
54
        password => '!LFKD%$&'
55
    );
56

            
57
L<DBIx::Custom>はL<DBI>のラッパです。
58
L<DBI>オブジェクトはC<dbh>で取得することができます。
59

            
60
    my $dbh = $dbi->dbh;
61

            
62
データベースハンドル属性にはデフォルトで次のものが設定されます。
63
    
64
    $dbi->dbh->{RaiseError} = 1;
65
    $dbi->dbh->{PrintError} = 0;
66
    $dbi->dbh->{AutoCommit} = 1;
67

            
68
この設定を行っているので、致命的なエラーが起こると、
69
例外が発生しプログラムは終了します。
70
またクエリが発行されると自動的にコミットされます。
71

            
72
=head2 2. シュガーメソッド
73

            
74
L<DBIx::Custom>は、
75
C<insert()>、C<update()>、C<delete()>、C<select()>
76
のようなシュガーメソッドを持っています。
77
小さなことを行うのであれば、SQL文を
78
作成する必要はありません。
79

            
80
=head3 C<insert()>
81

            
82
C<insert>メソッドです。データベースにデータを挿入します。
83

            
84
    $dbi->insert(table  => 'books',
85
                 param  => {title => 'Perl', author => 'Ken'});
86

            
87
これは次のL<DBI>の操作と同じです。
88

            
89
    my $sth = $dbh->prepare('insert into (title, author) values (?, ?);');
90
    $sth->execute('Perl', 'Ken');
91

            
92
=head3 C<update()>
93

            
94
C<update>メソッドです。データベースのデータを更新します。
95

            
96
    $dbi->update(table  => 'books', 
97
                 param  => {title => 'Perl', author => 'Ken'}, 
98
                 where  => {id => 5});
99

            
100
これは次のL<DBI>の操作と同じです。
101

            
102
    my $sth = $dbh->prepare(
103
        'update books set title = ?, author = ? where id = ?;');
104
    $sth->execute('Perl', 'Ken', 5);
105

            
106
C<update>メソッドは安全のため
107
where句のないSQLを発行することを許可していません。
108
もしすべての行を更新したい場合は
109
C<update_all()>メソッドを使用してください。
110

            
111
    $dbi->update_all(table  => 'books', 
112
                     param  => {title => 'Perl', author => 'Ken'});
113

            
114
=head3 C<delete()>
115

            
116
C<delete>メソッドです。データベースのデータを削除します。
117

            
118
    $dbi->delete(table  => 'books',
119
                 where  => {author => 'Ken'});
120

            
121
これは次のL<DBI>の操作と同じです。
122

            
123
    my $sth = $dbh->prepare('delete from books where id = ?;');
124
    $sth->execute('Ken');
125

            
126
C<delete>メソッドは安全のため
127
where句のないSQLを発行することを許可していません。
128
もしすべての行を削除したい場合は
129
C<delete_all()>メソッドを使用してください。
130

            
131
    $dbi->delete_all(table  => 'books');
132

            
133
=head3 C<select()>
134

            
135
C<select>メソッドです。テーブル名だけを指定しています。
136

            
137
    my $result = $dbi->select(table => 'books');
138

            
139
これは次のL<DBI>の操作と同じです。
140

            
141
    my $sth = $dbh->prepare('select * from books;);
142
    $sth->execute;
143

            
144
C<select()>メソッドの戻り値はL<DBIx::Custom::Result>
145
オブジェクトです。C<fetch>メソッドを使用して
146
行をフェッチすることができます。
147

            
148
    while (my $row = $result->fetch) {
149
        my $title  = $row->[0];
150
        my $author = $row->[1];
151
    }
152

            
153
次のC<select>は行の名前とwhere句を指定したものです。
154

            
155
    my $result = $dbi->select(
156
        table  => 'books',
157
        column => [qw/author title/],
158
        where  => {author => 'Ken'}
159
    );
160

            
161
次のL<DBI>の操作と同じです。
162
    
163
    my $sth = $dbh->prepare(
164
        'select author, title from books where author = ?;');
165
    $sht->execute('Ken');
166

            
167
テーブルをjoinしたい場合はC<relation>を使用します。
168

            
169
    my $result = $dbi->select(
170
        table    => ['books', 'rental'],
171
        column   => ['books.name as book_name']
172
        relation => {'books.id' => 'rental.book_id'}
173
    );
174

            
175
次のL<DBI>の操作と同じです。
176

            
177
    my $sth = $dbh->prepare(
178
        'select books.name as book_name from books, rental' .
179
        'where books.id = rental.book_id;');
180
    $sth->execute;
181

            
182
SQL文の末尾に文字列を追加したい場合は<append>オプションを使用します。
183

            
184
    my $result = $dbi->select(
185
        table  => 'books',
186
        where  => {author => 'Ken'},
187
        append => 'order by price limit 5',
188
    );
189

            
190
次のL<DBI>の操作と同じです。
191

            
192
    my $sth = $dbh->prepare(
193
        'select * books where author = ? order by price limit 5;');
194
    $sth->execute;
195

            
196
C<append>オプションは、C<insert()>、C<update()>、C<update_all()>
197
C<delete()>、C<select>メソッドで使用することが
198
できます。
199

            
200
この後のフィルタリングの解説で詳しく扱いますが、値をフィルタリングしたい
201
場合はC<filter>オプションを使用することができます。
202

            
203
    $dbi->insert(table  => 'books',
204
                 param  => {title => 'Perl', author => 'Ken'});
205
                 filter => {title  => 'encode_utf8',
206
                            author => 'encode_utf8'});
207

            
208
C<filter>オプションは、C<insert()>、C<update()>、C<update_all()>
209
C<delete()>、C<select>メソッドで使用することが
210
できます。
211

            
updated document
yuki-kimoto authored on 2010-10-21
212
C<select()>メソッドのC<where>オプションではハッシュの代わりに
213
タグを利用することもできます。これによって柔軟な
214
条件を指定することができます。
215

            
216
    # Select, more flexible where
217
    my $result = $dbi->select(
218
        table  => 'books',
219
        where  => ['{= author} and {like title}', 
220
                   {author => 'Ken', title => '%Perl%'}]
221
    );
222

            
223
タグについては以降で解説します。
224

            
added experimental expand me...
yuki-kimoto authored on 2010-10-20
225
=head2 3. 行のフェッチ
226

            
227
C<select()>メソッドの戻り値であるL<DBIx::Custom::Result>
228
には行をフェッチするためのさまざまなメソッドが
229
用意されています。
230
(このセクションの解説では「配列」は「配列のリファレンス」を
231
「ハッシュ」は「ハッシュのリファレンス」を意味しますので
232
注意してください。)
233

            
234
=head3 C<fetch>
235

            
236
一行フェッチして配列に格納します。
237

            
238
    while (my $row = $result->fetch) {
239
        my $author = $row->[0];
240
        my $title  = $row->[1];
241
    }
242

            
243
=head3 C<fetch_first>
244

            
245
一行だけフェッチして配列に格納します。
246

            
247
    my $row = $result->fetch_first;
248

            
249
フェッチが終わった後は、ステートメントハンドルからC<finish()>
250
メソッドが呼び出されてそれ以上フェッチできなくなります。
251

            
252
=head3 C<fetch_multi>
253

            
254
複数行をフェッチして配列の配列に格納します。
255

            
256
    while (my $rows = $result->fetch_multi(5)) {
257
        my $first_author  = $rows->[0][0];
258
        my $first_title   = $rows->[0][1];
259
        my $second_author = $rows->[1][0];
260
        my $second_value  = $rows->[1][1];
261
    }
262

            
263
=head3 C<fetch_all>
264

            
265
すべての行をフェッチして配列の配列に格納します。
266

            
267
    my $rows = $result->fetch_all;
268

            
269
=head3 C<fetch_hash>
270

            
271
一行フェッチしてハッシュに格納します。
272

            
273
    while (my $row = $result->fetch_hash) {
274
        my $title  = $row->{title};
275
        my $author = $row->{author};
276
    }
277

            
278
=head3 C<fetch_hash_first>
279

            
280
一行だけフェッチしてハッシュに格納します。
281

            
282
    my $row = $result->fetch_hash_first;
283

            
284
フェッチが終わった後は、ステートメントハンドルからC<finish()>
285
メソッドが呼び出されてそれ以上フェッチできなくなります。
286

            
287
=head3 C<fetch_hash_multi>
288

            
289
複数行をフェッチしてハッシュの配列に格納します。
290

            
291
    while (my $rows = $result->fetch_hash_multi(5)) {
292
        my $first_title   = $rows->[0]{title};
293
        my $first_author  = $rows->[0]{author};
294
        my $second_title  = $rows->[1]{title};
295
        my $second_author = $rows->[1]{author};
296
    }
297

            
298
=head3 C<fetch_all>
299

            
300
すべての行をフェッチしてハッシュの配列に格納します。
301

            
302
    my $rows = $result->fetch_hash_all;
303

            
updated document
yuki-kimoto authored on 2010-10-21
304
L<DBI>のステートメントハンドルに直接アクセスしたい場合は
added experimental expand me...
yuki-kimoto authored on 2010-10-20
305
<sth>を使用します。
306

            
307
    my $sth = $result->sth;
308

            
updated document
yuki-kimoto authored on 2010-10-21
309
=head2 4. ハッシュパラメタバインド
added experimental expand me...
yuki-kimoto authored on 2010-10-20
310

            
updated document
yuki-kimoto authored on 2010-10-21
311
L<DBIx::Custom>はハッシュパラメタバインドを提供します。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
312

            
updated document
yuki-kimoto authored on 2010-10-21
313
まず最初にL<DBI>による通常のパラメタバインドをご覧ください。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
314

            
315
    use DBI;
316
    my $dbh = DBI->connect(...);
317
    my $sth = $dbh->prepare(
318
        "select * from books where author = ? and title like ?;"
319
    );
320
    $sth->execute('Ken', '%Perl%');
321

            
updated document
yuki-kimoto authored on 2010-10-21
322
これはデータベースシステムがSQLをキャッシュすることができ、
323
パラメータは自動的にクォートされるので、
324
パフォーマンス面でも、セキュリティ面でも
325
とても良い方法です。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
326

            
updated document
yuki-kimoto authored on 2010-10-21
327

            
328
L<DBIx::Custom>はこれを改善して、ハッシュで
329
パラメタを指定できるようにしました。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
330

            
331
    my $result = $dbi->execute(
332
        "select * from books where {= author} and {like title};"
333
        param => {author => 'Ken', title => '%Perl%'}
334
    );
335

            
updated document
yuki-kimoto authored on 2010-10-21
336
C<{= author}>とC<{like title}>はタグと呼ばれます。
337
タグは内部ではプレースホルダを含む文字列に置き換えられます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
338

            
339
    select * from books where {= author} and {like title}
340

            
updated document
yuki-kimoto authored on 2010-10-21
341
という文は以下のSQLに置き換えられます。
342

            
343
    select * from books where author = ? and title like ?;
344

            
345
このようにタグを使ってSQL文を表現するのがL<DBIx::Custom>の
346
特徴です。以下のタグが利用可能です。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
347

            
348
    [TAG]                       [REPLACED]
349
    {? NAME}               ->   ?
350
    {= NAME}               ->   NAME = ?
351
    {<> NAME}              ->   NAME <> ?
352
    
353
    {< NAME}               ->   NAME < ?
354
    {> NAME}               ->   NAME > ?
355
    {>= NAME}              ->   NAME >= ?
356
    {<= NAME}              ->   NAME <= ?
357
    
358
    {like NAME}            ->   NAME like ?
359
    {in NAME COUNT}        ->   NAME in [?, ?, ..]
360
    
361
    {insert_param NAME1 NAME2}   ->   (NAME1, NAME2) values (?, ?)
362
    {update_param NAME1 NAME2}   ->   set NAME1 = ?, NAME2 = ?
363

            
updated document
yuki-kimoto authored on 2010-10-21
364
これらの変換はL<DBIx::Custom::QueryBuilder>によって行われます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
365

            
updated document
yuki-kimoto authored on 2010-10-21
366
C<{>とC<}>は予約語です。これらの文字を使いたい場合は
367
「\」を使ってエスケープする必要があります。
368
'\'はPerlのエスケープ文字なので、
369
エスケープするためには'\\'と書く必要があることに注意
370
してください。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
371

            
372
    'select * from books \\{ something statement \\}'
373

            
updated document
yuki-kimoto authored on 2010-10-21
374
=head2 5. フィルタリング
375

            
376
=head3 パラメタバインド時のフィルタリング
added experimental expand me...
yuki-kimoto authored on 2010-10-20
377

            
updated document
yuki-kimoto authored on 2010-10-21
378
データベースに登録するデータをフィルタリングしたい場合
379
があります。たとえば、内部文字列で文字列を保持している場合は
380
データベースにデータを登録する前に、バイト文字列に変換する
381
必要があります。L<DBIx::Custom>のフィルタリングシステムは
382
あるデータを他のデータに変換するのを手助けしてくれます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
383

            
updated document
yuki-kimoto authored on 2010-10-21
384
フィルタリングを利用するにはまず、
385
C<register_filter()>メソッドを使用して
386
フィルタを登録しておく必要があります。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
387

            
388
    $dbi->register_filter(
389
        to_upper_case => sub {
390
            my $value = shift;
391
            return uc $value;
392
        }
393
    );
394

            
updated document
yuki-kimoto authored on 2010-10-21
395
デフォルトのフィルタとしてC<encode_utf8>とC<decode_utf8>
396
が登録されています。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
397

            
updated document
yuki-kimoto authored on 2010-10-21
398
登録されているフィルタはC<execute()>メソッドのC<filter>オプション
399
で指定することができます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
400

            
401
    my $result = $dbi->execute(
402
        "select * from books where {= author} and {like title};"
403
        param  => {author => 'Ken', title => '%Perl%'},
404
        filter => {author => 'to_upper_case, title => 'encode_utf8'}
405
    );
406

            
updated document
yuki-kimoto authored on 2010-10-21
407
この例ではC<author>の値はバインドされるときに大文字に変換され、
408
C<title>の値はバイト文字列に変換されます。
409

            
410
C<filter>オプションは
411
C<insert()>、C<update()>、 C<update_all()>,
412
C<delete()>、C<select()>
413
メソッドにおいても使用することができます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
414

            
updated document
yuki-kimoto authored on 2010-10-21
415
    # insert() with filter option
added experimental expand me...
yuki-kimoto authored on 2010-10-20
416
    $dbi->insert(table  => 'books',
417
                 param  => {title => 'Perl', author => 'Ken'},
418
                 filter => {title => 'encode_utf8'});
419
    
updated document
yuki-kimoto authored on 2010-10-21
420
    # select() with filter option
added experimental expand me...
yuki-kimoto authored on 2010-10-20
421
    my $result = $dbi->select(
422
        table  => 'books',
423
        column => [qw/author title/],
424
        where  => {author => 'Ken'},
425
        append => 'order by id limit 1',
426
        filter => {title => 'encode_utf8'}
427
    );
428

            
updated document
yuki-kimoto authored on 2010-10-21
429
C<filter>で指定されたフィルタはそれぞれのパラメータの値に働きますが、
430
すべてのパラメータのためのデフォルトのフィルタを設定することもできます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
431

            
432
    $dbi->default_bind_filter('encode_utf8');
433

            
updated document
yuki-kimoto authored on 2010-10-21
434
C<filter()>オプションで指定されたフィルタは、
435
デフォルトのフィルタを上書きます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
436
    
437
    $dbi->default_bind_filter('encode_utf8');
438
    $dbi->insert(
439
        table  => 'books',
440
        param  => {title => 'Perl', author => 'Ken', price => 1000},
441
        filter => {author => 'to_upper_case', price => undef}
442
    );
443

            
updated document
yuki-kimoto authored on 2010-10-21
444
C<title>の値にはデフォルトのフィルタであるC<encode_utf8>が適用され
445
C<author>の値にはC<to_upper_case>が適用されます。
446
C<price>にはundefを設定しているのでフィルタが解除されます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
447

            
updated document
yuki-kimoto authored on 2010-10-21
448
=head3 行のフェッチ時のフィルタリング
added experimental expand me...
yuki-kimoto authored on 2010-10-20
449

            
updated document
yuki-kimoto authored on 2010-10-21
450
行をフェッチするときのフィルタも設定することができます。
451
これはL<DBIx::Custom::Result>クラスのC<filter>メソッドを使って
452
行います。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
453

            
454
    my $result = $dbi->select(table => 'books');
455
    $result->filter({title => 'decode_utf8', author => 'to_upper_case'});
456

            
updated document
yuki-kimoto authored on 2010-10-21
457
フィルタはそれぞれの列の値に作用しますが、
458
すべての列のためのデフォルのトフィルタを設定することもできます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
459

            
460
    $dbi->default_fetch_filter('decode_utf8');
461

            
updated document
yuki-kimoto authored on 2010-10-21
462
C<filter>メソッドで設定されたフィルタはデフォルトのフィルタを上書きます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
463

            
464
    $dbi->default_fetch_filter('decode_utf8');
465
    my $result = $dbi->select(
466
        table => 'books',
467
        columns => ['title', 'author', 'price']
468
    );
469
    $result->filter({author => 'to_upper_case', price => undef});
470

            
updated document
yuki-kimoto authored on 2010-10-21
471
C<title>の値にはデフォルトのフィルタであるC<decode_utf8>が適用され
472
C<author>の値にはC<to_upper_case>が適用されます。
473
C<price>にはundefを設定しているのでフィルタが解除されます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
474

            
updated document
yuki-kimoto authored on 2010-10-21
475
フェッチのためのフィルタにおいて、
476
たとえ、列名が大文字を含む場合であっても
477
列名は小文字であることに注意してください。
478
これはデータベースシステムに依存させないための要件です。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
479

            
updated document
yuki-kimoto authored on 2010-10-21
480
=head2 6. パフォーマンスの改善
added experimental expand me...
yuki-kimoto authored on 2010-10-20
481

            
updated document
yuki-kimoto authored on 2010-10-21
482
=head3 フィルタのチェックを無効にする
added experimental expand me...
yuki-kimoto authored on 2010-10-20
483

            
updated document
yuki-kimoto authored on 2010-10-21
484
フィルタのチェックがデフォルトでは有効になっています。
485
これは正しいフィルタ名が指定されているかどうかをチェック
486
するためのものですが、ときにはパフォーマンスに影響を
487
及ぼす可能性があります。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
488

            
updated document
yuki-kimoto authored on 2010-10-21
489
フィルタのチェックを無効にするにはC<filter_check>
490
に0を設定してください。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
491

            
492
    $dbi->filter_check(0);
493

            
updated document
yuki-kimoto authored on 2010-10-21
494
=head3 シュガーメソッドを使わない
added experimental expand me...
yuki-kimoto authored on 2010-10-20
495

            
updated document
yuki-kimoto authored on 2010-10-21
496
もしC<insert()>メソッドを使用してインサートを実行した場合、
497
必要なパフォーマンスを得られない場合があるかもしれません。
498
C<insert()>メソッドは、SQL文とステートメントハンドルを
499
毎回作成するためすこし遅いです。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
500

            
updated document
yuki-kimoto authored on 2010-10-21
501
そのような場合は、C<create_query()>メソッドによって
502
クエリを用意しておくことができます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
503
    
504
    my $query = $dbi->create_query(
505
        "insert into books {insert_param title author};"
506
    );
507

            
updated document
yuki-kimoto authored on 2010-10-21
508
戻り値はL<DBIx::Custom::Query>オブジェクトです。
509
このオブジェクトはSQL文とパラメータバインド時の列名を
510
保持しています。またステートメントハンドルも保持しています。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
511

            
512
    {
513
        sql     => 'insert into books (title, author) values (?, ?);',
updated document
yuki-kimoto authored on 2010-10-21
514
        columns => ['title', 'author'],
515
        sth     => $sth
added experimental expand me...
yuki-kimoto authored on 2010-10-20
516
    }
517

            
updated document
yuki-kimoto authored on 2010-10-21
518
クエリオブジェクトを使って繰り返し実行するには次のようにします。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
519
    
520
    my $inputs = [
521
        {title => 'Perl',      author => 'Ken'},
522
        {title => 'Good days', author => 'Mike'}
523
    ];
524
    
525
    foreach my $input (@$inputs) {
526
        $dbi->execute($query, $input);
527
    }
528

            
updated document
yuki-kimoto authored on 2010-10-21
529
C<execute>メソッドの第一引数にクエリオブジェトを渡すことができます。
530
これはC<insert()>メソッドよりも高速です。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
531

            
updated document
yuki-kimoto authored on 2010-10-21
532
=head3 キャッシング
added experimental expand me...
yuki-kimoto authored on 2010-10-20
533

            
updated document
yuki-kimoto authored on 2010-10-21
534
C<execute()>メソッドはデフォルトでSQL文への解析結果をキャッシュします。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
535

            
536
    $dbi->cache(1);
537

            
updated document
yuki-kimoto authored on 2010-10-21
538
キャッシングはメモリ上で行われますが、C<cache_method()>
539
を使って変更することができます。これはキャッシュされるデータの保存と取得
540
のためのメソッドを定義するのに利用されます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
541

            
542
    $dbi->cache_method(sub {
543
        sub {
544
            my $self = shift;
545
            
546
            $self->{_cached} ||= {};
547
            
548
            # Set cache
549
            if (@_ > 1) {
550
                $self->{_cached}{$_[0]} = $_[1] 
551
            }
552
            
553
            # Get cache
554
            else {
555
                return $self->{_cached}{$_[0]}
556
            }
557
        }
558
    });
559

            
updated document
yuki-kimoto authored on 2010-10-21
560
最初の引数はL<DBIx::Custom>です。第二引数は、
561
"select * from books where {= title} and {= author};";
562
のようなSQL文の源です。
563
第三引数は
564
{sql => "select * from books where title = ? and author = ?",
565
 columns => ['title', 'author']}
566
のような解析後のデータです。これはハッシュリファレンスである必要
567
があります。
568
もし引数がふたつより大きい場合は、このメソッドはキャッシュを保存
569
するのに利用されます。そうでない場合はキャッシュを取得するのに
570
利用されます。
571

            
572
=head2 7. その他の機能
added experimental expand me...
yuki-kimoto authored on 2010-10-20
573

            
574
=head3 トランザクション
575

            
updated document
yuki-kimoto authored on 2010-10-21
576
トランザクションを便利に利用するために、
577
C<begin_work()>、C<commit()>、C<rollback()>
578
という三つのメソッドが容易されています。
579
これはL<DBI>の同名のメソッドと同じ機能を持ちます。
580

            
581
    $dbi->begin_work;
582
    
583
    eval {
584
        $dbi->update(...);
585
        $dbi->update(...);
586
    };
587
    
588
    if ($@) {
589
        $dbi->rollback;
590
    }
591
    else {
592
        $dbi->commit;
593
    }
added experimental expand me...
yuki-kimoto authored on 2010-10-20
594

            
updated document
yuki-kimoto authored on 2010-10-21
595
=head3 selectメソッドの結果クラスの変更
added experimental expand me...
yuki-kimoto authored on 2010-10-20
596

            
updated document
yuki-kimoto authored on 2010-10-21
597
必要ならばC<select()>メソッドの結果クラスを変更することができます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
598

            
599
    package Your::Result;
600
    use base 'DBIx::Custom::Result';
601
    
602
    sub some_method { ... }
603

            
604
    1;
605
    
606
    package main;
607
    
608
    use Your::Result;
609
    
610
    my $dbi = DBIx::Custom->connect(...);
611
    $dbi->result_class('Your::Result');
612

            
updated document
yuki-kimoto authored on 2010-10-21
613
=head3 L<DBIx::Custom::QueryBuilder>の機能の拡張
added experimental expand me...
yuki-kimoto authored on 2010-10-20
614

            
updated document
yuki-kimoto authored on 2010-10-21
615
新しいタグが欲しい場合はL<DBIx::Custom::QueryBuilder>の機能を拡張
616
することができます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
617

            
618
    my $dbi = DBIx::Custom->connect(...);
619
    $dbi->query_builder->register_tag_processor(
620
        name => sub {
621
           ...
622
        }
623
    );
624

            
updated document
yuki-kimoto authored on 2010-10-21
625
=head3 ヘルパーメソッドの登録
added experimental expand me...
yuki-kimoto authored on 2010-10-20
626

            
updated document
yuki-kimoto authored on 2010-10-21
627
ヘルパーメソッドを登録することができます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
628

            
629
    $dbi->helper(
630
        update_or_insert => sub {
631
            my $self = shift;
632
            # do something
633
        },
634
        find_or_create   => sub {
635
            my $self = shift;
636
            # do something
637
        }
638
    );
639

            
updated document
yuki-kimoto authored on 2010-10-21
640
<helper()>メソッドで登録したメソッドは
641
L<DBIx::Custom>オブジェクトから直接呼び出すことができます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
642

            
643
    $dbi->update_or_insert;
644
    $dbi->find_or_create;
645

            
updated document
yuki-kimoto authored on 2010-10-21
646
=head3 ユーティリティメソッド(実験的)
647

            
648
C<expand>メソッドを使用すると次のようなハッシュに含まれる
649
テーブル名と列名を結合することができます。
650

            
651
    my %expanded = $dbi->expand(\%source);
652

            
653
以下のハッシュ
654

            
655
    {books => {title => 'Perl', author => 'Ken'}}
656

            
657
は次のように展開されます。
658

            
659
    ('books.title' => 'Perl', 'books.author' => 'Ken')
660

            
661
これはテーブル名を含むselect文で利用すると便利です。
662

            
663
    my $param = {title => 'Perl', author => '%Ken%'};
664
    $dbi->execute(
665
        'select * from books where {= books.title} && {like books.author};',
666
        param => {$dbi->expand({books => $param})}
667
    );
668

            
added experimental expand me...
yuki-kimoto authored on 2010-10-20
669
=cut