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

            
updated document
yuki-kimoto authored on 2010-10-22
3
=head1 NAME
added experimental expand me...
yuki-kimoto authored on 2010-10-20
4

            
updated document
yuki-kimoto authored on 2010-10-22
5
DBIx::Custom::Guides::Ja - DBIx::Customの日本語ガイド
added experimental expand me...
yuki-kimoto authored on 2010-10-20
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

            
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
41
B<Data sourceのサンプル:>
added experimental expand me...
yuki-kimoto authored on 2010-10-20
42

            
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
43
MySQL
added experimental expand me...
yuki-kimoto authored on 2010-10-20
44

            
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
45
    "dbi:mysql:database=$database"
46
    "dbi:mysql:database=$database;host=$hostname;port=$port"
added experimental expand me...
yuki-kimoto authored on 2010-10-20
47

            
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
48
SQLite
49

            
50
    "dbi:SQLite:dbname=$database"
51
    "dbi:SQLite:dbname=:memory:"
52

            
53
PostgreSQL
54

            
55
    "dbi:Pg:dbname=$dbname"
56

            
57
Oracle
58

            
59
    "dbi:Oracle:$dbname"
60
    "dbi:Oracle:host=$host;sid=$sid"
61

            
62
ODBC(Microsoft Access)
63

            
64
    "dbi:ODBC:driver=Microsoft Access Driver (*.mdb);dbq=hoge.mdb"
65

            
66
ODBC(SQL Server)
67

            
68
   "dbi:ODBC:driver={SQL Server};Server=(local);database=test;Trusted_Connection=yes;AutoTranslate=No;"
added experimental expand me...
yuki-kimoto authored on 2010-10-20
69

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

            
73
    my $dbh = $dbi->dbh;
74

            
75
データベースハンドル属性にはデフォルトで次のものが設定されます。
76
    
77
    $dbi->dbh->{RaiseError} = 1;
78
    $dbi->dbh->{PrintError} = 0;
79
    $dbi->dbh->{AutoCommit} = 1;
80

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

            
85
=head2 2. シュガーメソッド
86

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

            
93
=head3 C<insert()>
94

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

            
97
    $dbi->insert(table  => 'books',
98
                 param  => {title => 'Perl', author => 'Ken'});
99

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

            
102
    my $sth = $dbh->prepare('insert into (title, author) values (?, ?);');
103
    $sth->execute('Perl', 'Ken');
104

            
105
=head3 C<update()>
106

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

            
109
    $dbi->update(table  => 'books', 
110
                 param  => {title => 'Perl', author => 'Ken'}, 
111
                 where  => {id => 5});
112

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

            
115
    my $sth = $dbh->prepare(
116
        'update books set title = ?, author = ? where id = ?;');
117
    $sth->execute('Perl', 'Ken', 5);
118

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

            
124
    $dbi->update_all(table  => 'books', 
125
                     param  => {title => 'Perl', author => 'Ken'});
126

            
127
=head3 C<delete()>
128

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

            
131
    $dbi->delete(table  => 'books',
132
                 where  => {author => 'Ken'});
133

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

            
136
    my $sth = $dbh->prepare('delete from books where id = ?;');
137
    $sth->execute('Ken');
138

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

            
144
    $dbi->delete_all(table  => 'books');
145

            
146
=head3 C<select()>
147

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

            
150
    my $result = $dbi->select(table => 'books');
151

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

            
154
    my $sth = $dbh->prepare('select * from books;);
155
    $sth->execute;
156

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

            
161
    while (my $row = $result->fetch) {
162
        my $title  = $row->[0];
163
        my $author = $row->[1];
164
    }
165

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

            
168
    my $result = $dbi->select(
169
        table  => 'books',
170
        column => [qw/author title/],
171
        where  => {author => 'Ken'}
172
    );
173

            
174
次のL<DBI>の操作と同じです。
175
    
176
    my $sth = $dbh->prepare(
177
        'select author, title from books where author = ?;');
178
    $sht->execute('Ken');
179

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

            
182
    my $result = $dbi->select(
183
        table    => ['books', 'rental'],
184
        column   => ['books.name as book_name']
185
        relation => {'books.id' => 'rental.book_id'}
186
    );
187

            
188
次のL<DBI>の操作と同じです。
189

            
190
    my $sth = $dbh->prepare(
191
        'select books.name as book_name from books, rental' .
192
        'where books.id = rental.book_id;');
193
    $sth->execute;
194

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

            
197
    my $result = $dbi->select(
198
        table  => 'books',
199
        where  => {author => 'Ken'},
200
        append => 'order by price limit 5',
201
    );
202

            
203
次のL<DBI>の操作と同じです。
204

            
205
    my $sth = $dbh->prepare(
206
        'select * books where author = ? order by price limit 5;');
207
    $sth->execute;
208

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

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

            
216
    $dbi->insert(table  => 'books',
217
                 param  => {title => 'Perl', author => 'Ken'});
218
                 filter => {title  => 'encode_utf8',
219
                            author => 'encode_utf8'});
220

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

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

            
229
    # Select, more flexible where
230
    my $result = $dbi->select(
231
        table  => 'books',
232
        where  => ['{= author} and {like title}', 
233
                   {author => 'Ken', title => '%Perl%'}]
234
    );
235

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

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

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

            
247
=head3 C<fetch>
248

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

            
251
    while (my $row = $result->fetch) {
252
        my $author = $row->[0];
253
        my $title  = $row->[1];
254
    }
255

            
256
=head3 C<fetch_first>
257

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

            
260
    my $row = $result->fetch_first;
261

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

            
265
=head3 C<fetch_multi>
266

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

            
269
    while (my $rows = $result->fetch_multi(5)) {
270
        my $first_author  = $rows->[0][0];
271
        my $first_title   = $rows->[0][1];
272
        my $second_author = $rows->[1][0];
273
        my $second_value  = $rows->[1][1];
274
    }
275

            
276
=head3 C<fetch_all>
277

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

            
280
    my $rows = $result->fetch_all;
281

            
282
=head3 C<fetch_hash>
283

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

            
286
    while (my $row = $result->fetch_hash) {
287
        my $title  = $row->{title};
288
        my $author = $row->{author};
289
    }
290

            
291
=head3 C<fetch_hash_first>
292

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

            
295
    my $row = $result->fetch_hash_first;
296

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

            
300
=head3 C<fetch_hash_multi>
301

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

            
304
    while (my $rows = $result->fetch_hash_multi(5)) {
305
        my $first_title   = $rows->[0]{title};
306
        my $first_author  = $rows->[0]{author};
307
        my $second_title  = $rows->[1]{title};
308
        my $second_author = $rows->[1]{author};
309
    }
310

            
311
=head3 C<fetch_all>
312

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

            
315
    my $rows = $result->fetch_hash_all;
316

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

            
320
    my $sth = $result->sth;
321

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

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

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

            
328
    use DBI;
329
    my $dbh = DBI->connect(...);
330
    my $sth = $dbh->prepare(
331
        "select * from books where author = ? and title like ?;"
332
    );
333
    $sth->execute('Ken', '%Perl%');
334

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

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

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

            
344
    my $result = $dbi->execute(
345
        "select * from books where {= author} and {like title};"
346
        param => {author => 'Ken', title => '%Perl%'}
347
    );
348

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

            
352
    select * from books where {= author} and {like title}
353

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

            
356
    select * from books where author = ? and title like ?;
357

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

            
361
    [TAG]                       [REPLACED]
362
    {? NAME}               ->   ?
363
    {= NAME}               ->   NAME = ?
364
    {<> NAME}              ->   NAME <> ?
365
    
366
    {< NAME}               ->   NAME < ?
367
    {> NAME}               ->   NAME > ?
368
    {>= NAME}              ->   NAME >= ?
369
    {<= NAME}              ->   NAME <= ?
370
    
371
    {like NAME}            ->   NAME like ?
372
    {in NAME COUNT}        ->   NAME in [?, ?, ..]
373
    
374
    {insert_param NAME1 NAME2}   ->   (NAME1, NAME2) values (?, ?)
375
    {update_param NAME1 NAME2}   ->   set NAME1 = ?, NAME2 = ?
376

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

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

            
385
    'select * from books \\{ something statement \\}'
386

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

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

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

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

            
401
    $dbi->register_filter(
402
        to_upper_case => sub {
403
            my $value = shift;
404
            return uc $value;
405
        }
406
    );
407

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

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

            
414
    my $result = $dbi->execute(
415
        "select * from books where {= author} and {like title};"
416
        param  => {author => 'Ken', title => '%Perl%'},
417
        filter => {author => 'to_upper_case, title => 'encode_utf8'}
418
    );
419

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

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

            
updated document
yuki-kimoto authored on 2010-10-21
428
    # insert() with filter option
added experimental expand me...
yuki-kimoto authored on 2010-10-20
429
    $dbi->insert(table  => 'books',
430
                 param  => {title => 'Perl', author => 'Ken'},
431
                 filter => {title => 'encode_utf8'});
432
    
updated document
yuki-kimoto authored on 2010-10-21
433
    # select() with filter option
added experimental expand me...
yuki-kimoto authored on 2010-10-20
434
    my $result = $dbi->select(
435
        table  => 'books',
436
        column => [qw/author title/],
437
        where  => {author => 'Ken'},
438
        append => 'order by id limit 1',
439
        filter => {title => 'encode_utf8'}
440
    );
441

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

            
445
    $dbi->default_bind_filter('encode_utf8');
446

            
updated document
yuki-kimoto authored on 2010-10-21
447
C<filter()>オプションで指定されたフィルタは、
448
デフォルトのフィルタを上書きます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
449
    
450
    $dbi->default_bind_filter('encode_utf8');
451
    $dbi->insert(
452
        table  => 'books',
453
        param  => {title => 'Perl', author => 'Ken', price => 1000},
454
        filter => {author => 'to_upper_case', price => undef}
455
    );
456

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

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

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

            
467
    my $result = $dbi->select(table => 'books');
468
    $result->filter({title => 'decode_utf8', author => 'to_upper_case'});
469

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

            
473
    $dbi->default_fetch_filter('decode_utf8');
474

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

            
477
    $dbi->default_fetch_filter('decode_utf8');
478
    my $result = $dbi->select(
479
        table => 'books',
480
        columns => ['title', 'author', 'price']
481
    );
482
    $result->filter({author => 'to_upper_case', price => undef});
483

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

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

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

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

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

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

            
505
    $dbi->filter_check(0);
506

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

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

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

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

            
525
    {
526
        sql     => 'insert into books (title, author) values (?, ?);',
updated document
yuki-kimoto authored on 2010-10-21
527
        columns => ['title', 'author'],
528
        sth     => $sth
added experimental expand me...
yuki-kimoto authored on 2010-10-20
529
    }
530

            
updated document
yuki-kimoto authored on 2010-10-21
531
クエリオブジェクトを使って繰り返し実行するには次のようにします。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
532
    
533
    my $inputs = [
534
        {title => 'Perl',      author => 'Ken'},
535
        {title => 'Good days', author => 'Mike'}
536
    ];
537
    
538
    foreach my $input (@$inputs) {
539
        $dbi->execute($query, $input);
540
    }
541

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

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

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

            
549
    $dbi->cache(1);
550

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

            
555
    $dbi->cache_method(sub {
556
        sub {
557
            my $self = shift;
558
            
559
            $self->{_cached} ||= {};
560
            
561
            # Set cache
562
            if (@_ > 1) {
563
                $self->{_cached}{$_[0]} = $_[1] 
564
            }
565
            
566
            # Get cache
567
            else {
568
                return $self->{_cached}{$_[0]}
569
            }
570
        }
571
    });
572

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

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

            
587
=head3 トランザクション
588

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

            
594
    $dbi->begin_work;
595
    
596
    eval {
597
        $dbi->update(...);
598
        $dbi->update(...);
599
    };
600
    
601
    if ($@) {
602
        $dbi->rollback;
603
    }
604
    else {
605
        $dbi->commit;
606
    }
added experimental expand me...
yuki-kimoto authored on 2010-10-20
607

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

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

            
612
    package Your::Result;
613
    use base 'DBIx::Custom::Result';
614
    
615
    sub some_method { ... }
616

            
617
    1;
618
    
619
    package main;
620
    
621
    use Your::Result;
622
    
623
    my $dbi = DBIx::Custom->connect(...);
624
    $dbi->result_class('Your::Result');
625

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

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

            
631
    my $dbi = DBIx::Custom->connect(...);
632
    $dbi->query_builder->register_tag_processor(
633
        name => sub {
634
           ...
635
        }
636
    );
637

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

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

            
642
    $dbi->helper(
643
        update_or_insert => sub {
644
            my $self = shift;
645
            # do something
646
        },
647
        find_or_create   => sub {
648
            my $self = shift;
649
            # do something
650
        }
651
    );
652

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

            
656
    $dbi->update_or_insert;
657
    $dbi->find_or_create;
658

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

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

            
664
    my %expanded = $dbi->expand(\%source);
665

            
666
以下のハッシュ
667

            
668
    {books => {title => 'Perl', author => 'Ken'}}
669

            
670
は次のように展開されます。
671

            
672
    ('books.title' => 'Perl', 'books.author' => 'Ken')
673

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

            
676
    my $param = {title => 'Perl', author => '%Ken%'};
677
    $dbi->execute(
678
        'select * from books where {= books.title} && {like books.author};',
679
        param => {$dbi->expand({books => $param})}
680
    );
681

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