Showing 2 changed files with 181 additions and 67 deletions
+2
lib/DBIx/Custom/Guide.pod
... ...
@@ -4,6 +4,8 @@ DBIx::Custom::Guide - DBIx::Custom Guides
4 4
 
5 5
 =head1 GUIDE
6 6
 
7
+B<This guide is a little old and not complete. Please wait for a while.>
8
+
7 9
 =head2 1. Connect to the database
8 10
 
9 11
     use DBIx::Custom;
+179 -67
lib/DBIx/Custom/Guide/Ja.pod
... ...
@@ -231,7 +231,7 @@ C<insert()>、C<update()>、C<delete()>、C<select()>
231 231
 のような挿入、更新、削除、選択を行うためのメソッドを持っています。
232 232
 簡単なことをを行うのであれば、SQLを自分で記述する必要がありません。
233 233
 
234
-=head3 C<insert()>
234
+=head3 データの挿入 C<insert()>
235 235
 
236 236
 データベースにデータを挿入するにはC<insert()>を使用します。
237 237
 
... ...
@@ -244,7 +244,7 @@ C<table>にはテーブル名、C<param>には挿入したいデータを指定
244 244
 
245 245
     insert into (title, author) values (?, ?);
246 246
 
247
-=head3 C<update()>
247
+=head3 データの更新 C<update()>
248 248
 
249 249
 データベースのデータを更新するには、C<update()>を使用します。
250 250
 
... ...
@@ -267,7 +267,7 @@ C<update_all()>を使用してください。
267 267
     $dbi->update_all(table  => 'book', 
268 268
                      param  => {title => 'Perl', author => 'Ken'});
269 269
 
270
-=head3 C<delete()>
270
+=head3 データの削除 C<delete()>
271 271
 
272 272
 データベースのデータを1件削除するには、C<delete()>を使用します。
273 273
 
... ...
@@ -287,7 +287,7 @@ C<delete_all()>を使用してください。
287 287
 
288 288
     $dbi->delete_all(table  => 'book');
289 289
 
290
-=head3 C<select()>
290
+=head3 データの選択 C<select()>
291 291
 
292 292
 行を選択するにはC<select()>を使用します。
293 293
 
... ...
@@ -350,7 +350,7 @@ SQL文の末尾に文字列を追加したい場合は<append>を使用します
350 350
 またC<append>は、C<select>だけでなくC<insert()>、C<update()>、C<update_all()>
351 351
 C<delete()>、C<delete_all()>、C<select()>で使用することもできます。
352 352
 
353
-=head4 execute
353
+=head3 SQLの実行 C<execute()>
354 354
 
355 355
 任意のSQLを実行するにはexecuteメソッドを使用します。
356 356
 
... ...
@@ -390,7 +390,7 @@ C<select()>メソッドの戻り値はL<DBIx::Custom::Result>オブジェクト
390 390
 L<DBIx::Custom::Result>には行をフェッチするためのさまざまなメソッドが
391 391
 用意されています。
392 392
 
393
-=head3 C<fetch>
393
+=head3 1行づつフェッチ(配列) C<fetch()>
394 394
 
395 395
 一行フェッチして配列のリファレンスに格納するにはC<fetch()>を使用します。
396 396
 
... ...
@@ -401,7 +401,7 @@ L<DBIx::Custom::Result>には行をフェッチするためのさまざまなメ
401 401
 
402 402
 whileループを使って、すべての行を取得することができます。
403 403
 
404
-=head3 C<fetch_first>
404
+=head3 最初の行だけフェッチ(配列) C<fetch_first()>
405 405
 
406 406
 一行だけフェッチして配列のリファレンスに格納するにはC<fetch_first()>
407 407
 を使用します。
... ...
@@ -412,7 +412,7 @@ whileループを使って、すべての行を取得することができます
412 412
 内部的には1行のフェッチが終わった後に
413 413
 ステートメントハンドルのC<finish()>が実行されます。
414 414
 
415
-=head3 C<fetch_multi>
415
+=head3 複数行を順にフェッチ(配列) C<fetch_multi()>
416 416
 
417 417
 複数行をフェッチして配列のリファレンスを要素に持つ
418 418
 配列のリファレンスに格納するにはC<fetch_multi()>を使用します。
... ...
@@ -434,7 +434,7 @@ whileループを使って、すべての行を取得することができます
434 434
         ['Ruby', 'Mark']
435 435
     ]
436 436
 
437
-=head3 C<fetch_all>
437
+=head3 すべての行をフェッチ(配列) C<fetch_all>
438 438
 
439 439
 すべての行をフェッチして配列のリファレンスを要素に持つ
440 440
 配列のリファレンスに格納するにはC<fetch_all()>を使用します。
... ...
@@ -448,7 +448,7 @@ whileループを使って、すべての行を取得することができます
448 448
         ['Ruby', 'Mark']
449 449
     ]
450 450
 
451
-=head3 C<fetch_hash>
451
+=head3 1行づつフェッチ(ハッシュ) C<fetch_hash()>
452 452
 
453 453
 一行フェッチしてハッシュのリファレンスに格納するにはC<fetch_hash()>を使用します。
454 454
 
... ...
@@ -457,7 +457,7 @@ whileループを使って、すべての行を取得することができます
457 457
         my $author = $row->{author};
458 458
     }
459 459
 
460
-=head3 C<fetch_hash_first>
460
+=head3 最初の行だけフェッチ(ハッシュ) C<fetch_hash_first()>
461 461
 
462 462
 一行だけフェッチしてハッシュのリファレンスに格納するには
463 463
 C<fetch_hash_first()>を使用します。
... ...
@@ -468,7 +468,7 @@ C<fetch_hash_first()>を使用します。
468 468
 内部的には1行のフェッチが終わった後に
469 469
 ステートメントハンドルのC<finish()>が実行されます。
470 470
 
471
-=head3 C<fetch_hash_multi>
471
+=head3 複数行を順にフェッチ(ハッシュ) C<fetch_hash_multi()>
472 472
 
473 473
 複数行をフェッチしてハッシュのリファレンスを要素に持つ
474 474
 配列のリファレンスに格納するにはC<fetch_hash_multi()>
... ...
@@ -490,7 +490,7 @@ C<fetch_hash_first()>を使用します。
490 490
         {title => 'Ruby', author => 'Mark'}
491 491
     ]
492 492
 
493
-=head3 C<fetch_all>
493
+=head3 すべての行をフェッチ(ハッシュ) C<fetch_hash_all()>
494 494
 
495 495
 すべての行をフェッチしてハッシュのリファレンスを要素に持つ
496 496
 配列のリファレンスに格納するにはC<fetch_hash_all()>
... ...
@@ -505,7 +505,7 @@ C<fetch_hash_first()>を使用します。
505 505
         {title => 'Ruby', author => 'Mark'}
506 506
     ]
507 507
 
508
-=head3 sth
508
+=head3 ステートメントハンドル C<sth()>
509 509
 
510 510
 ステートメントハンドルに直接アクセスしたい場合は
511 511
 <sth>で取得することができます。
... ...
@@ -525,7 +525,7 @@ C<fetch_hash_first()>を使用します。
525 525
 データベースの日付のフォーマットに、
526 526
 データベースからデータを取得するときは、その逆を行えると便利です。
527 527
 
528
-=head3 フィルタの登録
528
+=head3 フィルタの登録 C<register_filter()>
529 529
 
530 530
 フィルタを登録するにはC<register_filter()>を使用します。
531 531
 
... ...
@@ -549,7 +549,7 @@ C<fetch_hash_first()>を使用します。
549 549
 
550 550
 登録したフィルタはC<apply_filter()>などで利用することができます。
551 551
 
552
-=head3 フィルタの適用
552
+=head3 フィルタの適用 C<apply_filter()>
553 553
 
554 554
 作成したフィルタを適用するには、C<apply_filter()>を使用します。
555 555
 
... ...
@@ -585,7 +585,7 @@ C<delete_all()>、C<select()>で有効になります。
585 585
 このような自動的に実行されるフィルタを登録できることがL<DBIx::Custom>の
586 586
 特徴のひとつです。
587 587
 
588
-=head3 個別のフィルタの適用
588
+=head3 個別のフィルタの適用 C<filter>
589 589
 
590 590
 C<apply_filter()>を使って最初にすべてのテーブルの列について
591 591
 フィルタを定義することもできますが、
... ...
@@ -638,6 +638,8 @@ C<DBIx::Custom::Result>クラスのC<filter>メソッドを使用します。
638 638
         'issue_year' => {out => 'tp_to_year', in => 'year_to_tp'}
639 639
     );
640 640
 
641
+=head3 最終出力のためのフィルタリング C<end_filter()>
642
+
641 643
 C<DBIx::Custom::Result>ではさらに最後にもう一度、フィルタを追加で
642 644
 登録することができます。たとえばHTMLに出力したい場合に、Time::Piece
643 645
 オブジェクトから読みやすい記述に変換することができます。
... ...
@@ -659,7 +661,7 @@ C<DBIx::Custom::Result>ではさらに最後にもう一度、フィルタを追
659 661
     $result->end_filter(...);
660 662
     my $row = $result->fetch_hash_first;
661 663
 
662
-=head3 列の情報を元にフィルタを適用する
664
+=head3 列の情報を元にフィルタを適用する C<each_column()>
663 665
 
664 666
 日付型の列は手動で設定しなくても、自動的に設定できると便利です。
665 667
 このためにデータベースのテーブルの列のすべての情報を
... ...
@@ -691,81 +693,191 @@ each_columnはコールバックを受け取ります。コールバックの引
691 693
 
692 694
 =head2 5. タグ
693 695
 
694
-L<DBIx::Custom>はハッシュパラメタバインドを提供します。
696
+=head3 タグの機能
695 697
 
696
-まず最初にL<DBI>による通常のパラメタバインドをご覧ください。
698
+L<DBIx::Custom>はSQLの中にタグを埋め込む機能を持っています。
697 699
 
698
-    use DBI;
699
-    my $dbh = DBI->connect(...);
700
-    my $sth = $dbh->prepare(
701
-        "select * from book where author = ? and title like ?;"
702
-    );
703
-    $sth->execute('Ken', '%Perl%');
700
+    select * from book where {= title} and {like author};
704 701
 
705
-これはデータベースシステムがSQLをキャッシュすることができ、
706
-パラメータは自動的にクォートされるので、
707
-パフォーマンス面でも、セキュリティ面でも
708
-とても良い方法です。
702
+{= title}と{like author}の部分がタグです。タグは次のような形式
703
+を持ちます。
709 704
 
705
+    {タグ名 引数1 引数2 ...}
706
+    
707
+タグはC<{>で始まり、C<}>で終わります。最初のC<{>とタグ名の間
708
+には空白を挿入しないよう注意してください。
710 709
 
711
-L<DBIx::Custom>はこれを改善して、ハッシュで
712
-パラメタを指定できるようにしました。
710
+タグの機能のためにC<{>とC<}>は予約語になっています。
711
+もし利用したい場合は直前に\をおいてエスケープを行う必要があります。
713 712
 
714
-    my $result = $dbi->execute(
715
-        "select * from book where {= author} and {like title};"
716
-        param => {author => 'Ken', title => '%Perl%'}
717
-    );
713
+    select from book \\{ ... \\}
714
+
715
+C<\>自体がPerlのエスケープ文字ですので、
716
+エスケープする場合はC<\>が二つ必要になるという点に注意してください。
717
+
718
+上記のタグはSQLが実行される前に次のSQLに展開されます。
719
+
720
+    select * from book where title = ? and author like ?;
718 721
 
719
-C<{= author}>とC<{like title}>はタグと呼ばれます。
720
-タグは内部ではプレースホルダを含む文字列に置き換えられます。
722
+タグを含むSQLを実行するにはC<execute()>を使用します。
721 723
 
722
-    select * from book where {= author} and {like title}
724
+    my $sql = "select * from book where {= author} and {like title};"
725
+    $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'});
723 726
 
724
-という文は以下のSQLに置き換えられます。
727
+C<param>オプションを使って、プレースホルダに埋め込みたい値を
728
+ハッシュリファレンスで指定することができます。
725 729
 
726
-    select * from book where author = ? and title like ?;
730
+他のメソッドと同様にC<execute()>においてもC<filter>を指定することができます。
731
+
732
+    $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'}
733
+                  filter => {title => 'to_something');
734
+
735
+C<execute>のひとつの注意点としてはC<apply_filter()>で適用されたフィルタ
736
+はデフォルトでは有効ではないということに注意してください。
737
+C<apply_filter()>で適用されたフィルタを有効にするには、
738
+C<table>を指定する必要があります。
739
+
740
+    $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'}
741
+                  table => ['book']);
742
+
743
+=head2 タグ一覧
744
+
745
+L<DBIx::Custom>では次のタグが使用可能です。
727 746
 
728 747
 このようにタグを使ってSQL文を表現するのがL<DBIx::Custom>の
729 748
 特徴です。以下のタグが利用可能です。
730 749
 
731
-    [TAG]                       [REPLACED]
732
-    {? NAME}               ->   ?
733
-    {= NAME}               ->   NAME = ?
734
-    {<> NAME}              ->   NAME <> ?
735
-    
736
-    {< NAME}               ->   NAME < ?
737
-    {> NAME}               ->   NAME > ?
738
-    {>= NAME}              ->   NAME >= ?
739
-    {<= NAME}              ->   NAME <= ?
740
-    
741
-    {like NAME}            ->   NAME like ?
742
-    {in NAME COUNT}        ->   NAME in [?, ?, ..]
743
-    
750
+=head3 C<?>
751
+
752
+C<?>タグは以下のように展開されます。
753
+
754
+    {? NAME}    ->   ?
755
+
756
+=head3 C<=>
757
+
758
+C<=>タグは以下のように展開されます。
759
+
760
+    {= NAME}    ->   NAME = ?
761
+
762
+=head3 C<E<lt>E<gt>>
763
+
764
+C<E<lt>E<gt>>タグは以下のように展開されます。
765
+
766
+    {<> NAME}   ->   NAME <> ?
767
+
768
+=head3 C<E<lt>>
769
+
770
+C<E<lt>>タグは以下のように展開されます。
771
+
772
+    {< NAME}    ->   NAME < ?
773
+
774
+=head3 C<E<gt>>
775
+
776
+C<E<gt>>タグは以下のように展開されます。
777
+
778
+    {> NAME}    ->   NAME > ?
779
+
780
+=head3 C<E<gt>=>
781
+
782
+C<E<gt>=>タグは以下のように展開されます。
783
+
784
+    {>= NAME}   ->   NAME >= ?
785
+
786
+=head3 C<E<lt>=>
787
+
788
+C<E<lt>=>タグは以下のように展開されます。
789
+
790
+    {<= NAME}   ->   NAME <= ?
791
+
792
+=head3 C<like>
793
+
794
+C<like>タグは以下のように展開されます。
795
+
796
+    {like NAME}   ->   NAME like ?
797
+
798
+=head3 C<in>
799
+
800
+C<in>タグは以下のように展開されます。プレースホルダの
801
+数を引数で指定する必要があることに注意してください。
802
+
803
+    {in NAME COUNT}   ->   NAME in [?, ?, ..]
804
+
805
+=head3 C<insert_param>
806
+
807
+C<insert_param>タグは以下のように展開されます。
808
+
744 809
     {insert_param NAME1 NAME2}   ->   (NAME1, NAME2) values (?, ?)
810
+
811
+=head3 C<update_param>
812
+
813
+C<update_param>タグは以下のように展開されます。
814
+
745 815
     {update_param NAME1 NAME2}   ->   set NAME1 = ?, NAME2 = ?
746 816
 
747
-これらの変換はL<DBIx::Custom::QueryBuilder>によって行われます。
817
+=head2 同名の列の扱い
748 818
 
749
-C<{>とC<}>は予約語です。これらの文字を使いたい場合は
750
-「\」を使ってエスケープする必要があります。
751
-'\'はPerlのエスケープ文字なので、
752
-エスケープするためには'\\'と書く必要があることに注意
753
-してください。
819
+同名の列を含むタグがある場合にも、SQLを実行することができます。
820
+たとえば、二つの日付で比較しなければならない場合を
821
+考えて見ましょう。
754 822
 
755
-    'select * from book \\{ something statement \\}'
823
+    my $sql = "select * from table where {> date} and {< date};";
756 824
 
757
-=head3 L<DBIx::Custom::QueryBuilder>の機能の拡張
825
+このような場合は対応するパラメータの値を配列のリファレンスにします。
758 826
 
759
-新しいタグが欲しい場合はL<DBIx::Custom::QueryBuilder>の機能を拡張
760
-することができます。
827
+    my $dbi->execute($sql, param => {date => ['2010-10-01', '2012-02-10']});
828
+
829
+=head2 タグの追加 C<register_tag()>
830
+
831
+D<DBIx::Custom>ではタグを独自に追加することができます。
832
+タグを追加するにはC<register_tag()>を使用します。
761 833
 
762
-    my $dbi = DBIx::Custom->connect(...);
763 834
     $dbi->register_tag(
764
-        name => sub {
765
-           ...
835
+        '=' => sub {
836
+            my $column = shift;
837
+            
838
+            return ["$column = ?", [$column]];
766 839
         }
767 840
     );
768 841
 
842
+ここではデフォルトのC<=>タグがどのように実装されているかを示しています。
843
+タグを登録する関数の引数はタグの中に書かれた引数になります。
844
+
845
+    {タグ名 引数1 引数2}
846
+
847
+C<=>タグの場合は
848
+
849
+    {= title}
850
+
851
+という形式ですから、サブルーチンにはtitleというひとつの列名がわたってきます。
852
+
853
+サブルーチンの戻り値には次の形式の配列のリファレンスを返す必要があります。
854
+
855
+    [
856
+        展開後の文字列,
857
+        [プレースホルダに埋め込みに利用する列名1, 列名2, ...]
858
+    ]
859
+
860
+一つ目の要素は展開後の文字列です。この例では
861
+
862
+    'title = ?'
863
+
864
+を返す必要があります。
865
+
866
+二つ目の要素はプレースホルダに埋め込みに利用する列名を含む配列の
867
+リファレンスです。今回の例では
868
+
869
+    ['title']
870
+
871
+を返す必要があります。複数のプレースホルダを含む場合は、この部分が
872
+複数になります。C<insert_param>タグやC<update_param>タグは
873
+この部分が実際複数になっています。
874
+
875
+上記を合わせると
876
+
877
+    ['title = ?', ['title']]
878
+    
879
+を返す必要があるということです。
880
+
769 881
 =head2 6. Where句の動的な生成
770 882
 
771 883
 =head2 7. パフォーマンスの改善