Newer Older
594 lines | 18.183kb
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
=head3 C<append>オプション
183

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

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

            
192
次のL<DBI>の操作と同じです。
193

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

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

            
202
=head3 C<filter>オプション
203

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

            
207
    $dbi->insert(table  => 'books',
208
                 param  => {title => 'Perl', author => 'Ken'});
209
                 filter => {title  => 'encode_utf8',
210
                            author => 'encode_utf8'});
211

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

            
216
=head2 3. 行のフェッチ
217

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

            
225
=head3 C<fetch>
226

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

            
229
    while (my $row = $result->fetch) {
230
        my $author = $row->[0];
231
        my $title  = $row->[1];
232
    }
233

            
234
=head3 C<fetch_first>
235

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

            
238
    my $row = $result->fetch_first;
239

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

            
243
=head3 C<fetch_multi>
244

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

            
247
    while (my $rows = $result->fetch_multi(5)) {
248
        my $first_author  = $rows->[0][0];
249
        my $first_title   = $rows->[0][1];
250
        my $second_author = $rows->[1][0];
251
        my $second_value  = $rows->[1][1];
252
    }
253

            
254
=head3 C<fetch_all>
255

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

            
258
    my $rows = $result->fetch_all;
259

            
260
=head3 C<fetch_hash>
261

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

            
264
    while (my $row = $result->fetch_hash) {
265
        my $title  = $row->{title};
266
        my $author = $row->{author};
267
    }
268

            
269
=head3 C<fetch_hash_first>
270

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

            
273
    my $row = $result->fetch_hash_first;
274

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

            
278
=head3 C<fetch_hash_multi>
279

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

            
282
    while (my $rows = $result->fetch_hash_multi(5)) {
283
        my $first_title   = $rows->[0]{title};
284
        my $first_author  = $rows->[0]{author};
285
        my $second_title  = $rows->[1]{title};
286
        my $second_author = $rows->[1]{author};
287
    }
288

            
289
=head3 C<fetch_all>
290

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

            
293
    my $rows = $result->fetch_hash_all;
294

            
295
=head3 C<sth>
296

            
297
L<DBI>のステートメントハンドルにアクセスしたい場合は
298
<sth>を使用します。
299

            
300
    my $sth = $result->sth;
301

            
302
=head2 4. Hash parameter binding
303

            
304
L<DBIx::Custom> provides hash parameter binding.
305

            
306
At frist, I show normal parameter binding.
307

            
308
    use DBI;
309
    my $dbh = DBI->connect(...);
310
    my $sth = $dbh->prepare(
311
        "select * from books where author = ? and title like ?;"
312
    );
313
    $sth->execute('Ken', '%Perl%');
314

            
315
This is very good way because database system can enable SQL caching,
316
and parameter is quoted automatically. this is secure.
317

            
318
L<DBIx::Custom> hash parameter binding system improve
319
normal parameter binding to use hash parameter.
320

            
321
    my $result = $dbi->execute(
322
        "select * from books where {= author} and {like title};"
323
        param => {author => 'Ken', title => '%Perl%'}
324
    );
325

            
326
This is same as the normal way, execpt that the parameter is hash.
327
{= author} and {like title} is called C<tag>.
328
tag is expand to placeholder string internally.
329

            
330
    select * from books where {= author} and {like title}
331
      -> select * from books where author = ? and title like ?;
332

            
333
The following tags is available.
334

            
335
    [TAG]                       [REPLACED]
336
    {? NAME}               ->   ?
337
    {= NAME}               ->   NAME = ?
338
    {<> NAME}              ->   NAME <> ?
339
    
340
    {< NAME}               ->   NAME < ?
341
    {> NAME}               ->   NAME > ?
342
    {>= NAME}              ->   NAME >= ?
343
    {<= NAME}              ->   NAME <= ?
344
    
345
    {like NAME}            ->   NAME like ?
346
    {in NAME COUNT}        ->   NAME in [?, ?, ..]
347
    
348
    {insert_param NAME1 NAME2}   ->   (NAME1, NAME2) values (?, ?)
349
    {update_param NAME1 NAME2}   ->   set NAME1 = ?, NAME2 = ?
350

            
351
See also L<DBIx::Custom::QueryBuilder>.
352

            
353
C<{> and C<}> is reserved. If you use these charactors,
354
you must escape them using '\'. Note that '\' is
355
already perl escaped charactor, so you must write '\\'. 
356

            
357
    'select * from books \\{ something statement \\}'
358

            
359
=head2 5. Filtering
360

            
361
Usually, Perl string is kept as internal string.
362
If you want to save the string to database, You must encode the string.
363
Filtering system help you to convert a data to another data
364
when you save to the data and get the data form database.
365

            
366
If you want to register filter, use C<register_filter()> method.
367

            
368
    $dbi->register_filter(
369
        to_upper_case => sub {
370
            my $value = shift;
371
            return uc $value;
372
        }
373
    );
374

            
375
C<encode_utf8> and C<decode_utf8> filter is registerd by default.
376

            
377
You can specify these filters to C<filter> argument of C<execute()> method.
378

            
379
    my $result = $dbi->execute(
380
        "select * from books where {= author} and {like title};"
381
        param  => {author => 'Ken', title => '%Perl%'},
382
        filter => {author => 'to_upper_case, title => 'encode_utf8'}
383
    );
384

            
385
C<filter> argument can be specified to suger methods, such as
386
C<insert()>, C<update()>, C<update_all()>,
387
C<delete()>, C<delete_all()>, C<select()>.
388

            
389
    # insert(), having filter argument
390
    $dbi->insert(table  => 'books',
391
                 param  => {title => 'Perl', author => 'Ken'},
392
                 filter => {title => 'encode_utf8'});
393
    
394
    # select(), having filter argument
395
    my $result = $dbi->select(
396
        table  => 'books',
397
        column => [qw/author title/],
398
        where  => {author => 'Ken'},
399
        append => 'order by id limit 1',
400
        filter => {title => 'encode_utf8'}
401
    );
402

            
403
Filter works each parmeter, but you prepare default filter for all parameters.
404

            
405
    $dbi->default_bind_filter('encode_utf8');
406

            
407
C<filter()> argument overwrites this default filter.
408
    
409
    $dbi->default_bind_filter('encode_utf8');
410
    $dbi->insert(
411
        table  => 'books',
412
        param  => {title => 'Perl', author => 'Ken', price => 1000},
413
        filter => {author => 'to_upper_case', price => undef}
414
    );
415

            
416
This is same as the following example.
417

            
418
    $dbi->insert(
419
        table  => 'books',
420
        param  => {title => 'Perl', author => 'Ken', price => 1000},
421
        filter => {title => 'encode_uft8' author => 'to_upper_case'}
422
    );
423

            
424
You can also specify filter when the row is fetched. This is reverse of bind filter.
425

            
426
    my $result = $dbi->select(table => 'books');
427
    $result->filter({title => 'decode_utf8', author => 'to_upper_case'});
428

            
429
Filter works each column value, but you prepare a default filter
430
for all clumn value.
431

            
432
    $dbi->default_fetch_filter('decode_utf8');
433

            
434
C<filter()> method of L<DBIx::Custom::Result>
435
overwrites this default filter.
436

            
437
    $dbi->default_fetch_filter('decode_utf8');
438
    my $result = $dbi->select(
439
        table => 'books',
440
        columns => ['title', 'author', 'price']
441
    );
442
    $result->filter({author => 'to_upper_case', price => undef});
443

            
444
This is same as the following one.
445

            
446
    my $result = $dbi->select(
447
        table => 'books',
448
        columns => ['title', 'author', 'price']
449
    );
450
    $result->filter({title => 'decode_utf8', author => 'to_upper_case'});
451

            
452
Note that in fetch filter, column names must be lower case
453
even if the column name conatains upper case charactors.
454
This is requirment not to depend database systems.
455

            
456
=head2 6. Get high performance
457

            
458
=head3 Disable filter checking
459

            
460
Filter checking is executed by default.
461
This is done to check right filter name is specified,
462
but sometimes damage performance.
463

            
464
If you disable this filter checking,
465
Set C<filter_check> attribute to 0.
466

            
467
    $dbi->filter_check(0);
468

            
469
=head3 Use execute() method instead suger methods
470

            
471
If you execute insert statement by C<insert()> method,
472
you sometimes can't get required performance.
473

            
474
C<insert()> method is a little slow because SQL statement and statement handle
475
is created every time.
476

            
477
In that case, you can prepare a query by C<create_query()> method.
478
    
479
    my $query = $dbi->create_query(
480
        "insert into books {insert_param title author};"
481
    );
482

            
483
Return value of C<create_query()> is L<DBIx::Custom::Query> object.
484
This keep the information of SQL and column names.
485

            
486
    {
487
        sql     => 'insert into books (title, author) values (?, ?);',
488
        columns => ['title', 'author']
489
    }
490

            
491
Execute query repeatedly.
492
    
493
    my $inputs = [
494
        {title => 'Perl',      author => 'Ken'},
495
        {title => 'Good days', author => 'Mike'}
496
    ];
497
    
498
    foreach my $input (@$inputs) {
499
        $dbi->execute($query, $input);
500
    }
501

            
502
This is faster than C<insert()> method.
503

            
504
=head3 caching
505

            
506
C<execute()> method caches the parsed result of the source of SQL.
507
Default to 1
508

            
509
    $dbi->cache(1);
510

            
511
Caching is on memory, but you can change this by C<cache_method()>.
512
First argument is L<DBIx::Custom> object.
513
Second argument is a source of SQL,
514
such as "select * from books where {= title} and {= author};";
515
Third argument is parsed result, such as
516
{sql => "select * from books where title = ? and author = ?",
517
 columns => ['title', 'author']}, this is hash reference.
518
If arguments is more than two, this method is called to set cache.
519
If not, this method is called to get cache.
520

            
521
    $dbi->cache_method(sub {
522
        sub {
523
            my $self = shift;
524
            
525
            $self->{_cached} ||= {};
526
            
527
            # Set cache
528
            if (@_ > 1) {
529
                $self->{_cached}{$_[0]} = $_[1] 
530
            }
531
            
532
            # Get cache
533
            else {
534
                return $self->{_cached}{$_[0]}
535
            }
536
        }
537
    });
538

            
539
=head2 7. More features
540

            
541
=head3 トランザクション
542

            
543

            
544
=head3 Change Result class
545

            
546
You can change Result class if you need.
547

            
548
    package Your::Result;
549
    use base 'DBIx::Custom::Result';
550
    
551
    sub some_method { ... }
552

            
553
    1;
554
    
555
    package main;
556
    
557
    use Your::Result;
558
    
559
    my $dbi = DBIx::Custom->connect(...);
560
    $dbi->result_class('Your::Result');
561

            
562
=head3 Custamize SQL builder object
563

            
564
You can custamize SQL builder object
565

            
566
    my $dbi = DBIx::Custom->connect(...);
567
    $dbi->query_builder->register_tag_processor(
568
        name => sub {
569
           ...
570
        }
571
    );
572

            
573
=head3 Resister helper method
574

            
575
You can resiter helper method.
576

            
577
    $dbi->helper(
578
        update_or_insert => sub {
579
            my $self = shift;
580
            # do something
581
        },
582
        find_or_create   => sub {
583
            my $self = shift;
584
            # do something
585
        }
586
    );
587

            
588
Register helper methods.
589
These method can be called from L<DBIx::Custom> object directory.
590

            
591
    $dbi->update_or_insert;
592
    $dbi->find_or_create;
593

            
594
=cut