... | ... |
@@ -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; |
... | ... |
@@ -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. パフォーマンスの改善 |