3 contributor
    
    
      
    
        =encoding utf8
=head1 NAME
DBIx::Custom::Guides::Ja - DBIx::Customの日本語ガイド
=head1 ガイド
L<DBIx::Custom>はデータベースへのクエリの発行を簡単に行うための
クラスです。L<DBIx::Class>やL<DBIx::Simple>と同じように
L<DBI>のラッパクラスになっています。
L<DBIx::Custom>はO/Rマッパーではありません。O/Rマッパーは
便利ですが、O/Rマッパのたくさんの文法を覚える必要があります。
また、O/Rマッパによって生成されたSQLは非効率なことがありますし、
複雑なSQLを生成することができないので、
生のSQLを発行しなければならない場合がたくさんあります。
L<DBIx::Custom>はO/Rマッパとは対照的な設計が行われています。
L<DBIx::Custom>の主な目的は、SQLを尊重しつつ、DBIだけでは
とてもめんどうな作業を簡単にすることです。もしSQLについて
多くの知識を持っているならば、L<DBIx::Custom>でそのまま
生かすことができます。
L<DBIx::Custom>の仕組みを簡単に説明しておきましょう。
L<DBIx::Custom>では、タグと呼ばれるものを
SQLの中に埋め込むことができます。
    select * from book where {= title} and {=author};
{}で囲まれた部分がタグです。このSQLは実際に実行されるときには
次のようにプレースホルダに展開されます。
    select * from book where title = ? and title = ?;
これらの展開にはどのような意味があるのでしょうかと質問
されることかと思います。
またSQLを簡単に実行するための、
C<insert()>, C<update()>, C<delete()>,C<select()>などの
シュガーメソッドも提供します。
L<DBIx::Custom>はSQLを尊重します。SQLはとても複雑で、美しくはありません。
けれども、SQLはデファクトスタンダードな技術です。
ですので、データベースを学ぶすべての人はSQLを知っています。
あなたがすでにSQLを知っているなら、L<DBIx::Custom>を使って
何かを行うために覚えることはとても少ないです。
では使い方を解説します。
=head2 1. データベースへの接続
L<DBIx::Custom>オブジェクトを生成し、データベースに接続するには
C<connect()>メソッドを使用します。
    use DBIx::Custom;
    my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=dbname",
                                    user => 'ken', password => '!LFKD%$&');
B<Data sourceのサンプル:>
MySQL
    "dbi:mysql:database=$database"
    "dbi:mysql:database=$database;host=$hostname;port=$port"
SQLite
    "dbi:SQLite:dbname=$database"
    "dbi:SQLite:dbname=:memory:"
PostgreSQL
    "dbi:Pg:dbname=$dbname"
Oracle
    "dbi:Oracle:$dbname"
    "dbi:Oracle:host=$host;sid=$sid"
ODBC(Microsoft Access)
    "dbi:ODBC:driver=Microsoft Access Driver (*.mdb);dbq=hoge.mdb"
ODBC(SQL Server)
   "dbi:ODBC:driver={SQL Server};Server=(local);database=test;Trusted_Connection=yes;AutoTranslate=No;"
L<DBIx::Custom>はL<DBI>のラッパです。
L<DBI>オブジェクトはC<dbh>で取得することができます。
    my $dbh = $dbi->dbh;
データベースハンドル属性にはデフォルトで次のものが設定されます。
    
    $dbi->dbh->{RaiseError} = 1;
    $dbi->dbh->{PrintError} = 0;
    $dbi->dbh->{AutoCommit} = 1;
この設定を行っているので、致命的なエラーが起こると、
例外が発生しプログラムは終了します。
またクエリが発行されると自動的にコミットされます。
=head2 2. シュガーメソッド
L<DBIx::Custom>は、
C<insert()>、C<update()>、C<delete()>、C<select()>
のようなシュガーメソッドを持っています。
小さなことを行うのであれば、SQL文を
作成する必要はありません。
=head3 C<insert()>
C<insert>メソッドです。データベースにデータを挿入します。
    $dbi->insert(table  => 'book',
                 param  => {title => 'Perl', author => 'Ken'});
これは次のL<DBI>の操作と同じです。
    my $sth = $dbh->prepare('insert into (title, author) values (?, ?);');
    $sth->execute('Perl', 'Ken');
=head3 C<update()>
C<update>メソッドです。データベースのデータを更新します。
    $dbi->update(table  => 'book', 
                 param  => {title => 'Perl', author => 'Ken'}, 
                 where  => {id => 5});
これは次のL<DBI>の操作と同じです。
    my $sth = $dbh->prepare(
        'update book set title = ?, author = ? where id = ?;');
    $sth->execute('Perl', 'Ken', 5);
C<update>メソッドは安全のため
where句のないSQLを発行することを許可していません。
もしすべての行を更新したい場合は
C<update_all()>メソッドを使用してください。
    $dbi->update_all(table  => 'book', 
                     param  => {title => 'Perl', author => 'Ken'});
=head3 C<delete()>
C<delete>メソッドです。データベースのデータを削除します。
    $dbi->delete(table  => 'book',
                 where  => {author => 'Ken'});
これは次のL<DBI>の操作と同じです。
    my $sth = $dbh->prepare('delete from book where id = ?;');
    $sth->execute('Ken');
C<delete>メソッドは安全のため
where句のないSQLを発行することを許可していません。
もしすべての行を削除したい場合は
C<delete_all()>メソッドを使用してください。
    $dbi->delete_all(table  => 'book');
=head3 C<select()>
C<select>メソッドです。テーブル名だけを指定しています。
    my $result = $dbi->select(table => 'book');
これは次のL<DBI>の操作と同じです。
    my $sth = $dbh->prepare('select * from book;);
    $sth->execute;
C<select()>メソッドの戻り値はL<DBIx::Custom::Result>
オブジェクトです。C<fetch>メソッドを使用して
行をフェッチすることができます。
    while (my $row = $result->fetch) {
        my $title  = $row->[0];
        my $author = $row->[1];
    }
次のC<select>は行の名前とwhere句を指定したものです。
    my $result = $dbi->select(
        table  => 'book',
        column => [qw/author title/],
        where  => {author => 'Ken'}
    );
次のL<DBI>の操作と同じです。
    
    my $sth = $dbh->prepare(
        'select author, title from book where author = ?;');
    $sht->execute('Ken');
テーブルをjoinしたい場合はC<relation>を使用します。
    my $result = $dbi->select(
        table    => ['book', 'rental'],
        column   => ['book.name as book_name']
        relation => {'book.id' => 'rental.book_id'}
    );
次のL<DBI>の操作と同じです。
    my $sth = $dbh->prepare(
        'select book.name as book_name from book, rental' .
        'where book.id = rental.book_id;');
    $sth->execute;
SQL文の末尾に文字列を追加したい場合は<append>オプションを使用します。
    my $result = $dbi->select(
        table  => 'book',
        where  => {author => 'Ken'},
        append => 'order by price limit 5',
    );
次のL<DBI>の操作と同じです。
    my $sth = $dbh->prepare(
        'select * book where author = ? order by price limit 5;');
    $sth->execute;
C<append>オプションは、C<insert()>、C<update()>、C<update_all()>
C<delete()>、C<select>メソッドで使用することが
できます。
この後のフィルタリングの解説で詳しく扱いますが、値をフィルタリングしたい
場合はC<filter>オプションを使用することができます。
    $dbi->insert(table  => 'book',
                 param  => {title => 'Perl', author => 'Ken'});
                 filter => {title  => 'encode_utf8',
                            a