Newer Older
1381 lines | 43.551kb
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

            
update pod
Yuki Kimoto authored on 2011-01-28
5
DBIx::Custom::Guide::Ja - DBIx::Customのガイドブック
added experimental expand me...
yuki-kimoto authored on 2010-10-20
6

            
7
=head1 ガイド
8

            
update pod
Yuki Kimoto authored on 2011-01-28
9
L<DBIx::Custom>はSQLの実行を簡単に行うためのクラスです。
10
L<DBIx::Class>やL<DBIx::Simple>と同じように
updated document
Yuki Kimoto authored on 2011-01-20
11
L<DBI>のラッパクラスになっています。L<DBIx::Class>よりも簡単に、
12
L<DBIx::Simple>よりもはるかに柔軟なことを行うことができます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
13

            
14
L<DBIx::Custom>はO/Rマッパーではありません。O/Rマッパーは
15
便利ですが、O/Rマッパのたくさんの文法を覚える必要があります。
updated document
Yuki Kimoto authored on 2011-01-20
16
また、O/Rマッパによって生成されたSQLは非効率なことがありますし、
17
複雑なSQLを生成することができないので、
update pod
Yuki Kimoto authored on 2011-01-31
18
生のSQLを実行しなければならない場合がたくさんあります。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
19

            
updated document
Yuki Kimoto authored on 2011-01-20
20
L<DBIx::Custom>はO/Rマッパとは対照的な設計が行われています。
updated document
Yuki Kimoto authored on 2011-01-20
21
L<DBIx::Custom>の主な目的は、SQLを尊重しつつ、L<DBI>だけでは
updated document
Yuki Kimoto authored on 2011-01-20
22
とてもめんどうな作業を簡単にすることです。もしSQLについて
23
多くの知識を持っているならば、L<DBIx::Custom>でそのまま
updated document
Yuki Kimoto authored on 2011-01-20
24
活用することができます。
updated document
Yuki Kimoto authored on 2011-01-20
25

            
update pod
Yuki Kimoto authored on 2011-01-28
26
L<DBIx::Custom>の仕組みを少しだけ説明しておきます。
updated document
Yuki Kimoto authored on 2011-01-20
27
L<DBIx::Custom>では、タグと呼ばれるものを
28
SQLの中に埋め込むことができます。
29

            
30
    select * from book where {= title} and {=author};
31

            
32
{}で囲まれた部分がタグです。このSQLは実際に実行されるときには
33
次のようにプレースホルダに展開されます。
34

            
updated document
Yuki Kimoto authored on 2011-01-20
35
    select * from book where title = ? and author = ?;
updated document
Yuki Kimoto authored on 2011-01-20
36

            
37
これらの展開にはどのような意味があるのでしょうかと質問
update pod
Yuki Kimoto authored on 2011-01-28
38
されるかもしれません。この簡単な仕組みの上に
39
便利な機能が実装されます。それは以下のようなものです。
updated document
Yuki Kimoto authored on 2011-01-20
40

            
updated document
Yuki Kimoto authored on 2011-01-20
41
=over 4
updated document
Yuki Kimoto authored on 2011-01-20
42

            
update pod
Yuki Kimoto authored on 2011-01-28
43
=item 1. プレースホルダにバインドする値をハッシュリファレンスで指定
updated document
Yuki Kimoto authored on 2011-01-20
44

            
update pod
Yuki Kimoto authored on 2011-01-28
45
L<DBI>を使うのであればプレースホルダにバインドする値は配列
updated document
Yuki Kimoto authored on 2011-01-20
46
で指定する必要があります。
updated document
Yuki Kimoto authored on 2011-01-20
47

            
updated document
Yuki Kimoto authored on 2011-01-20
48
    $sth->execute(@bind);
49

            
50
L<DBIx::Custom>を利用するのであればハッシュリファレンスで指定すること
51
できます。
52
    
53
    my $param = {title => 'Perl', author => 'Ken'};
54
    $dbi->execute($sql, $param);
55

            
update pod
Yuki Kimoto authored on 2011-01-28
56
=item 2. 値のフィルタリング
updated document
Yuki Kimoto authored on 2011-01-20
57

            
update pod
Yuki Kimoto authored on 2011-01-28
58
L<DBIx::Custom>はフィルタリングの機能を提供します。
updated document
Yuki Kimoto authored on 2011-01-20
59
たとえば、日付の列は、Perlで扱うときにはC<Time::Piece>などの日付オブジェクト
60
で扱い、データベースに格納するときはデータベースの日付型に変換したい
61
と思うのではないでしょうか。またデータベースから取り出すときは
62
データベースの日付型から日付オブジェクトに変換したと思うのでは
63
ないでしょうか。
64

            
65
このようなときはフィルタ機能を使うことができます。
66

            
67
まずフィルタを登録します。
68

            
69
    $dbi->register_filter(
70
        tp_to_date => sub {
71
            ...
72
        },
73
        date_to_tp => sub {
74
            ...
75
        }
76
    );
77

            
78
次にテーブルの各列にこのフィルタを適用します。
79

            
80
    $dbi->apply_filter('book',
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
81
        'issue_date' => {out => 'tp_to_date', in => 'date_to_tp'}
updated document
Yuki Kimoto authored on 2011-01-20
82
    );
83

            
84
outはPerlからデータベースに保存する方向、inはデータベースからPerlに取得する方向です。
85

            
update pod
Yuki Kimoto authored on 2011-01-28
86
多くのメソッドで自動的にこのフィルタが有効になります。
updated document
Yuki Kimoto authored on 2011-01-20
87

            
update pod
Yuki Kimoto authored on 2011-01-28
88
    $dbi->insert(table => 'book', param => {issue_date => $tp});
updated document
Yuki Kimoto authored on 2011-01-20
89

            
90
=item 3. 選択的な検索条件
91

            
update pod
Yuki Kimoto authored on 2011-01-28
92
L<DBI>では選択的に検索条件を作成することは難しいです。
updated document
Yuki Kimoto authored on 2011-01-20
93

            
94
たとえば、検索条件にtitleとauthorが指定された場合は次のSQLを
95

            
96
    select * from book where title = ? and author = ?;
97

            
98
titleだけの場合は次のSQLを
99

            
100
    select * from book where title = ?;
101
    
update pod
Yuki Kimoto authored on 2011-01-31
102
authorだけの場合は次のSQLを実行した場合を考えましょう。
updated document
Yuki Kimoto authored on 2011-01-20
103

            
104
    select * from book where author = ?;
105

            
106
これはとても大変な作業なので、通常はL<SQL::Abstract>を動的に生成してくれる
107
モジュールを利用することになります。
108

            
109
L<DBIx::Custom>はさらに簡単で便利な方法を用意しています。
110

            
update pod
Yuki Kimoto authored on 2011-01-28
111
    # Whereオブジェクト
updated document
Yuki Kimoto authored on 2011-01-20
112
    my $where = $dbi->where;
update pod
Yuki Kimoto authored on 2011-01-28
113
    
114
    # 検索条件
updated document
Yuki Kimoto authored on 2011-01-20
115
    $where->clause(
116
        ['and', '{= title}', {'= author'}]
117
    );
update pod
Yuki Kimoto authored on 2011-01-28
118
    
119
    # 必要な列を自動的に選択するための設定
120
    $where->param({title => 'Perl'});
updated document
Yuki Kimoto authored on 2011-01-20
121

            
update pod
Yuki Kimoto authored on 2011-01-28
122
    # SQLへのWhere句の埋め込み
updated document
Yuki Kimoto authored on 2011-01-20
123
    my $sql = "select * from book $where";
124

            
125
詳しい説明は後ほど行いますが、上記のように記述すれば、
126
L<DBIx::Custom>では選択的な検索条件を持つWhere句を生成することができます。
127
検索条件が入れ子になった構造やorについても対応しています。
128

            
129
=item 4. 挿入、更新、削除、選択を行うためのメソッド
130

            
update pod
Yuki Kimoto authored on 2011-01-30
131
L<DBIx::Custom>では挿入、更新、削除、選択を行うための
132
メソッドを提供しています。
133
C<insert()>, C<update()>, C<delete()>,C<select()>などがあります。
updated document
Yuki Kimoto authored on 2011-01-20
134

            
135
    my $param = {title => 'Perl', author => 'Ken'};
136
    $dbi->insert(table => 'book', param => $param);
137

            
update pod
Yuki Kimoto authored on 2011-01-30
138
=item 5. テーブルのためのメソッドの登録
updated document
Yuki Kimoto authored on 2011-01-20
139

            
update pod
Yuki Kimoto authored on 2011-01-30
140
テーブルのためにメソッドを登録することができます。
updated document
Yuki Kimoto authored on 2011-01-20
141

            
update pod
Yuki Kimoto authored on 2011-01-30
142
    $dbi->table('book')->method(
updated document
Yuki Kimoto authored on 2011-01-20
143
        list => sub {
144
            ...
145
        },
update pod
Yuki Kimoto authored on 2011-01-30
146
        something => sub {
147
            ...
updated document
Yuki Kimoto authored on 2011-01-20
148
        }
149
    );
150

            
update pod
Yuki Kimoto authored on 2011-01-30
151
メソッドの利用です。
updated document
Yuki Kimoto authored on 2011-01-20
152

            
153
    $dbi->table('book')->list;
added experimental expand me...
yuki-kimoto authored on 2010-10-20
154

            
update pod
Yuki Kimoto authored on 2011-01-30
155
多くのO/Rマッパではテーブルのためのクラスを作成する必要がありますが、
156
L<DBIx::Custom>では簡単です。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
157

            
updated document
Yuki Kimoto authored on 2011-01-20
158
=back
159

            
update pod
Yuki Kimoto authored on 2011-01-30
160
L<DBIx::Custom>はとても便利です。
161
興味をもたれた方は、続きをご覧になってみてください。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
162

            
163
=head2 1. データベースへの接続
164

            
update pod
Yuki Kimoto authored on 2011-01-30
165
L<DBIx::Custom>を読み込みます。
updated document
Yuki Kimoto authored on 2011-01-23
166

            
167
    use DBIx::Custom;
168

            
update pod
Yuki Kimoto authored on 2011-01-30
169
データベースに接続するにはC<connect()>メソッドを使用します。
170
戻り値はL<DBIx::Custom>オブジェクトです。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
171

            
updated document
Yuki Kimoto authored on 2011-01-23
172
    my $dbi = DBIx::Custom->connect(
update pod
Yuki Kimoto authored on 2011-01-30
173
        data_source => "dbi:mysql:database=bookstore",
updated document
Yuki Kimoto authored on 2011-01-23
174
        user => 'ken',
175
        password => '!LFKD%$&',
176
        dbi_options => {mysql_enable_utf8 => 1}
177
    );
added experimental expand me...
yuki-kimoto authored on 2010-10-20
178

            
update pod
Yuki Kimoto authored on 2011-01-30
179
C<data_source>はデータベースシステムに応じたものである必要があります。
180
以下はデータソースのサンプルです。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
181

            
updated document
Yuki Kimoto authored on 2011-01-23
182
B<MySQL>
added experimental expand me...
yuki-kimoto authored on 2010-10-20
183

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

            
updated document
Yuki Kimoto authored on 2011-01-23
187
B<SQLite>
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
188

            
189
    "dbi:SQLite:dbname=$database"
190
    "dbi:SQLite:dbname=:memory:"
191

            
updated document
Yuki Kimoto authored on 2011-01-23
192
B<PostgreSQL>
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
193

            
194
    "dbi:Pg:dbname=$dbname"
195

            
updated document
Yuki Kimoto authored on 2011-01-23
196
B<Oracle>
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
197

            
198
    "dbi:Oracle:$dbname"
199
    "dbi:Oracle:host=$host;sid=$sid"
200

            
updated document
Yuki Kimoto authored on 2011-01-23
201
B<ODBC(Microsoft Access)>
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
202

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

            
updated document
Yuki Kimoto authored on 2011-01-23
205
B<ODBC(SQL Server)>
deprecated DBIx::Custom::MyS...
root authored on 2010-11-26
206

            
207
   "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
208

            
update pod
Yuki Kimoto authored on 2011-01-30
209
認証が必要な場合は、C<user>とC<password>を指定できます。
updated document
Yuki Kimoto authored on 2011-01-23
210

            
update pod
Yuki Kimoto authored on 2011-01-30
211
L<DBIx::Custom>はL<DBI>のラッパークラスです。
212
L<DBI>のデータベースハンドルは取得するにあhC<dbh()>を使用します。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
213

            
214
    my $dbh = $dbi->dbh;
215

            
updated document
Yuki Kimoto authored on 2011-01-23
216
L<DBIx::Custom>ではデータベースハンドル属性にはデフォルトで次のものが設定されます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
217
    
218
    $dbi->dbh->{RaiseError} = 1;
219
    $dbi->dbh->{PrintError} = 0;
220
    $dbi->dbh->{AutoCommit} = 1;
221

            
update pod
Yuki Kimoto authored on 2011-01-30
222
致命的なエラーが起こるとプログラムは終了します。
223
SQLが実行されると自動的にコミットされます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
224

            
updated document
Yuki Kimoto authored on 2011-01-23
225
=head2 2. 挿入、更新、削除、選択のためのメソッド
added experimental expand me...
yuki-kimoto authored on 2010-10-20
226

            
update pod
Yuki Kimoto authored on 2011-01-31
227
下記のメソッドがあります。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
228

            
update pod
Yuki Kimoto authored on 2011-01-31
229
=head3 行の挿入 C<insert()>
added experimental expand me...
yuki-kimoto authored on 2010-10-20
230

            
update pod
Yuki Kimoto authored on 2011-01-31
231
データベースに行を挿入するにはC<insert()>を使用します。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
232

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
233
    $dbi->insert(table  => 'book',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
234
                 param  => {title => 'Perl', author => 'Ken'});
235

            
update pod
Yuki Kimoto authored on 2011-01-31
236
C<table>はテーブル名、C<param>は挿入する行のデータです。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
237

            
update pod
Yuki Kimoto authored on 2011-01-31
238
次のSQLが実行されます。
updated document
Yuki Kimoto authored on 2011-01-23
239

            
240
    insert into (title, author) values (?, ?);
added experimental expand me...
yuki-kimoto authored on 2010-10-20
241

            
update pod
Yuki Kimoto authored on 2011-01-26
242
=head3 データの更新 C<update()>
added experimental expand me...
yuki-kimoto authored on 2010-10-20
243

            
update pod
Yuki Kimoto authored on 2011-01-31
244
データベースの行を更新するには、C<update()>を使用します。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
245

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
246
    $dbi->update(table  => 'book', 
added experimental expand me...
yuki-kimoto authored on 2010-10-20
247
                 param  => {title => 'Perl', author => 'Ken'}, 
248
                 where  => {id => 5});
249

            
update pod
Yuki Kimoto authored on 2011-01-31
250
C<table>はテーブル名、C<param>は更新データ、C<where>は
251
条件です。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
252

            
update pod
Yuki Kimoto authored on 2011-01-31
253
次のSQLが実行されます。
updated document
Yuki Kimoto authored on 2011-01-23
254

            
255
    update book set title = ?, author = ?;
added experimental expand me...
yuki-kimoto authored on 2010-10-20
256

            
update pod
Yuki Kimoto authored on 2011-01-31
257
安全のためC<where>のないupdate()を実効することはできません。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
258
もしすべての行を更新したい場合は
updated document
Yuki Kimoto authored on 2011-01-23
259
C<update_all()>を使用してください。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
260

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
261
    $dbi->update_all(table  => 'book', 
added experimental expand me...
yuki-kimoto authored on 2010-10-20
262
                     param  => {title => 'Perl', author => 'Ken'});
263

            
update pod
Yuki Kimoto authored on 2011-01-26
264
=head3 データの削除 C<delete()>
added experimental expand me...
yuki-kimoto authored on 2010-10-20
265

            
update pod
Yuki Kimoto authored on 2011-01-31
266
データベースの行を1件削除するには、C<delete()>を使用します。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
267

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
268
    $dbi->delete(table  => 'book',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
269
                 where  => {author => 'Ken'});
270

            
update pod
Yuki Kimoto authored on 2011-01-31
271
C<table>はテーブル名、C<where>は条件です。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
272

            
update pod
Yuki Kimoto authored on 2011-01-31
273
次のSQLが実行されます。
updated document
Yuki Kimoto authored on 2011-01-23
274

            
275
    delete from book where id = ?;
added experimental expand me...
yuki-kimoto authored on 2010-10-20
276

            
update pod
Yuki Kimoto authored on 2011-01-31
277
安全のためC<where>のないC<delete()>を実効することはできません。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
278
もしすべての行を削除したい場合は
updated document
Yuki Kimoto authored on 2011-01-23
279
C<delete_all()>を使用してください。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
280

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
281
    $dbi->delete_all(table  => 'book');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
282

            
update pod
Yuki Kimoto authored on 2011-01-26
283
=head3 データの選択 C<select()>
added experimental expand me...
yuki-kimoto authored on 2010-10-20
284

            
updated document
Yuki Kimoto authored on 2011-01-23
285
行を選択するにはC<select()>を使用します。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
286

            
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
287
    my $result = $dbi->select(table => 'book');
added experimental expand me...
yuki-kimoto authored on 2010-10-20
288

            
update pod
Yuki Kimoto authored on 2011-01-31
289
次のSQLが実行されます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
290

            
updated document
Yuki Kimoto authored on 2011-01-23
291
    select * from book;
added experimental expand me...
yuki-kimoto authored on 2010-10-20
292

            
update pod
Yuki Kimoto authored on 2011-01-31
293
戻り値はL<DBIx::Custom::Result>
updated document
Yuki Kimoto authored on 2011-01-23
294
オブジェクトです。行をフェッチするにはC<fetch()>を使用します。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
295

            
296
    while (my $row = $result->fetch) {
297
        my $title  = $row->[0];
298
        my $author = $row->[1];
299
    }
300

            
update pod
Yuki Kimoto authored on 2011-01-31
301
L<DBIx::Custom::Result>についてはL<3. 行のフェッチ/"3. 行のフェッチ">を見てください。
updated document
Yuki Kimoto authored on 2011-01-23
302

            
update pod
Yuki Kimoto authored on 2011-01-31
303
サンプルを続けます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
304

            
305
    my $result = $dbi->select(
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
306
        table  => 'book',
updated document
Yuki Kimoto authored on 2011-01-23
307
        column => ['author',  'title'],
added experimental expand me...
yuki-kimoto authored on 2010-10-20
308
        where  => {author => 'Ken'}
309
    );
310

            
update pod
Yuki Kimoto authored on 2011-01-31
311
C<column>は列名、C<where>は条件です。
312

            
313
次のSQLが実行されます。
updated document
Yuki Kimoto authored on 2011-01-23
314

            
315
    select author, title from book where author = ?;
added experimental expand me...
yuki-kimoto authored on 2010-10-20
316

            
update pod
Yuki Kimoto authored on 2011-01-31
317
次のサンプルです。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
318

            
319
    my $result = $dbi->select(
DBIx::Custom::Model select()...
Yuki Kimoto authored on 2011-02-22
320
        table    => 'book',
updated document
Yuki Kimoto authored on 2011-01-23
321
        where    => {book.name => 'Perl'},
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
322
        relation => {'book.id' => 'rental.book_id'}
added experimental expand me...
yuki-kimoto authored on 2010-10-20
323
    );
324

            
update pod
Yuki Kimoto authored on 2011-01-31
325
C<relation>テーブル間の関係です。これは内部結合です。
326

            
327
次のSQLが実行されます。
328

            
updated document
Yuki Kimoto authored on 2011-01-23
329
bookテーブルのid列とrentalテーブルのbook_idが関連付けられます。
update pod
Yuki Kimoto authored on 2011-01-31
330
次のSQLが実行されます。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
331

            
updated document
Yuki Kimoto authored on 2011-01-23
332
    select * from book, rental where book.name = ? and book.id = rental.book_id;
added experimental expand me...
yuki-kimoto authored on 2010-10-20
333

            
update pod
Yuki Kimoto authored on 2011-01-31
334
次のサンプルです。
added experimental expand me...
yuki-kimoto authored on 2010-10-20
335

            
336
    my $result = $dbi->select(
remove DBIx::Custom::Model
Yuki Kimoto authored on 2011-01-12
337
        table  => 'book',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
338
        where  => {author => 'Ken'},
updated document
Yuki Kimoto authored on 2011-01-23
339
        append => 'for update',
added experimental expand me...
yuki-kimoto authored on 2010-10-20
340
    );
341

            
update pod
Yuki Kimoto authored on 2011-01-31
342
C<append>はSQLの末尾に追加される文字列です。
343

            
344
次のSQLが実行されます。
updated document
Yuki Kimoto authored on 2011-01-20
345

            
updated document
Yuki Kimoto authored on 2011-01-23
346
    select * book where author = ? for update;
updated document
Yuki Kimoto authored on 2011-01-20
347

            
updated document
Yuki Kimoto authored on 2011-01-23
348
またC<append>は、C<select>だけでなくC<insert()>、C<update()>、C<update_all()>
349
C<delete()>、C<delete_all()>、C<select()>で使用することもできます。
updated document
Yuki Kimoto authored on 2011-01-20
350

            
update pod
Yuki Kimoto authored on 2011-02-11
351
C<column>とC<table>を使用する代わりに、C<selection>を使用することも
352
できます。列名とテーブル名をまとめて指定する場合に利用します。
353
    
354
    my $selection = <<"EOS";
355
    title, author, company_name
356
    from book inner join company on book.company_id = company.id
357
    EOS
358

            
359
    $dbi->select(selection => $selection);
360

            
361
C<selection>においてはwhere句を利用できないということに注意してください。
362
"inner join"などの句を利用してください。
363

            
update pod
Yuki Kimoto authored on 2011-01-26
364
=head3 SQLの実行 C<execute()>
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
365

            
update pod
Yuki Kimoto authored on 2011-01-31
366
SQLを実行するにはC<execute()>を使用します。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
367

            
368
    $dbi->execute("select * from book;");
369

            
update pod
Yuki Kimoto authored on 2011-01-31
370
タグを処理してSQLを実行します。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
371

            
372
    $dbi->execute(
373
        "select * from book {= title} and {= author};"
374
        param => {title => 'Perl', author => 'Ken'}
375
    );
376

            
update pod
Yuki Kimoto authored on 2011-01-31
377
次のSQLが実行されます。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
378

            
379
    select * from book title = ? and author = ?;
380

            
update pod
Yuki Kimoto authored on 2011-01-31
381
プレースホルダにtitleとauthorの値が埋め込まれます。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
382

            
update pod
Yuki Kimoto authored on 2011-01-31
383
タグについてはL<5. タグ/"5. タグ">を見てください。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
384

            
update pod
Yuki Kimoto authored on 2011-01-31
385
またC<execute()>のSQLの末尾にはセミコロンを置く必要はありません。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
386

            
387
    $dbi->execute('select * from book');
388

            
update pod
Yuki Kimoto authored on 2011-02-28
389
=head3 プライマリーキーを利用した行の挿入 C<insert_at()>
390

            
391
プライマリーを使用して行を更新するにはC<insert_at()>を使用します。
392

            
393
    $dbi->insert_at(
394
        table => 'book', primary_key => ['id'],
395
        where => ['123'], param => {name => 'Ken'}
396
    );
397

            
398
この例ではidの列が123の行に挿入されます。C<where>には、配列の
399
リファレンスを渡す必要があることに注意してください。
400
なおC<param>にプライマリーキーが含まれていた場合は、そのキーが削除されます。
401

            
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
402
=head3 プライマリーキーを利用した行の更新 C<update_at()>
403

            
404
プライマリーを使用して行を更新するにはC<update_at()>を使用します。
405

            
406
    $dbi->update_at(
407
        table => 'book', primary_key => ['id'],
408
        where => ['123'], param => {name => 'Ken'}
409
    );
410

            
411
この例ではidの列が123の行が更新されます。C<where>には、配列の
412
リファレンスを渡す必要があることに注意してください。
update pod
Yuki Kimoto authored on 2011-02-28
413
なおC<param>にプライマリーキーが含まれていた場合は、そのキーが削除されます。
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
414

            
415
=head3 プライマリーキーを利用した行の削除 C<delete_at()>
416

            
417
プライマリーを使用して行を削除するにはC<delete_at()>を使用します。
418

            
419
    $dbi->delete_at(table => 'book', primary_key => ['id'], where => ['123']);
420

            
421
この例ではidの列が123の行が削除されます。C<where>には、配列の
422
リファレンスを渡す必要があることに注意してください。
423

            
424
また下のような記述方法も許されています。
425

            
426
    $dbi->delete_at(table => 'book', primary_key => ['id'], param => {id => '123'});
427

            
428
=head3 プライマリーキーを利用した行の選択 C<select_at()>
429

            
430
プライマリーを使用して行を選択するにはC<select_at()>を使用します。
431

            
432
    $dbi->select_at(table => 'book', primary_key => ['id'], where => ['123']);
433

            
434
この例ではidの列が123の行が選択されます。C<where>には、配列の
435
リファレンスを渡す必要があることに注意してください。
436

            
437
また下のような記述方法も許されています。
438

            
439
    $dbi->select_at(table => 'book', primary_key => ['id'], param => {id => '123'});
440

            
updated document
Yuki Kimoto authored on 2011-01-20
441
=head2 3. 行のフェッチ
442

            
updated document
Yuki Kimoto authored on 2011-01-23
443
C<select()>メソッドの戻り値はL<DBIx::Custom::Result>オブジェクトです。
update pod
Yuki Kimoto authored on 2011-02-04
444
行をフェッチするためのさまざまなメソッドがあります。
updated document
Yuki Kimoto authored on 2011-01-20
445

            
update pod
Yuki Kimoto authored on 2011-01-26
446
=head3 1行づつフェッチ(配列) C<fetch()>
updated document
Yuki Kimoto authored on 2011-01-20
447

            
updated document
Yuki Kimoto authored on 2011-01-23
448
一行フェッチして配列のリファレンスに格納するにはC<fetch()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
449

            
update pod
Yuki Kimoto authored on 2011-02-04
450
    my $row = $result->fetch;
451

            
452
以下のようにすべての行を取得することができます。
453

            
updated document
Yuki Kimoto authored on 2011-01-20
454
    while (my $row = $result->fetch) {
updated document
Yuki Kimoto authored on 2011-01-23
455
        my $title  = $row->[0];
456
        my $author = $row->[1];
updated document
Yuki Kimoto authored on 2011-01-20
457
    }
458

            
update pod
Yuki Kimoto authored on 2011-01-26
459
=head3 最初の行だけフェッチ(配列) C<fetch_first()>
updated document
Yuki Kimoto authored on 2011-01-20
460

            
updated document
Yuki Kimoto authored on 2011-01-23
461
一行だけフェッチして配列のリファレンスに格納するにはC<fetch_first()>
462
を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
463

            
464
    my $row = $result->fetch_first;
465

            
update pod
Yuki Kimoto authored on 2011-02-04
466
ステートメントハンドルのC<finish()>が実行される
467
ので残りの行をフェッチできません。
updated document
Yuki Kimoto authored on 2011-01-20
468

            
update pod
Yuki Kimoto authored on 2011-01-26
469
=head3 複数行を順にフェッチ(配列) C<fetch_multi()>
updated document
Yuki Kimoto authored on 2011-01-20
470

            
updated document
Yuki Kimoto authored on 2011-01-23
471
複数行をフェッチして配列のリファレンスを要素に持つ
472
配列のリファレンスに格納するにはC<fetch_multi()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
473

            
updated document
Yuki Kimoto authored on 2011-01-23
474
    while (my $rows = $result->fetch_multi(2)) {
475
        my $title0   = $rows->[0][0];
476
        my $author0  = $rows->[0][1];
477
        
478
        my $title1   = $rows->[1][0];
479
        my $author1  = $rows->[1][1];
updated document
Yuki Kimoto authored on 2011-01-20
480
    }
481

            
update pod
Yuki Kimoto authored on 2011-02-04
482
取り出したい行数を引数に指定します。
updated document
Yuki Kimoto authored on 2011-01-23
483

            
update pod
Yuki Kimoto authored on 2011-02-04
484
次のようなデータを取得できます。
updated document
Yuki Kimoto authored on 2011-01-23
485

            
486
    [
487
        ['Perl', 'Ken'],
488
        ['Ruby', 'Mark']
489
    ]
490

            
update pod
Yuki Kimoto authored on 2011-01-26
491
=head3 すべての行をフェッチ(配列) C<fetch_all>
updated document
Yuki Kimoto authored on 2011-01-20
492

            
updated document
Yuki Kimoto authored on 2011-01-23
493
すべての行をフェッチして配列のリファレンスを要素に持つ
494
配列のリファレンスに格納するにはC<fetch_all()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
495

            
496
    my $rows = $result->fetch_all;
497

            
updated document
Yuki Kimoto authored on 2011-01-23
498
すべての行を格納した次のようなデータを取得できます。
499

            
500
    [
501
        ['Perl', 'Ken'],
502
        ['Ruby', 'Mark']
503
    ]
504

            
update pod
Yuki Kimoto authored on 2011-01-26
505
=head3 1行づつフェッチ(ハッシュ) C<fetch_hash()>
updated document
Yuki Kimoto authored on 2011-01-20
506

            
updated document
Yuki Kimoto authored on 2011-01-23
507
一行フェッチしてハッシュのリファレンスに格納するにはC<fetch_hash()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
508

            
509
    while (my $row = $result->fetch_hash) {
510
        my $title  = $row->{title};
511
        my $author = $row->{author};
512
    }
513

            
update pod
Yuki Kimoto authored on 2011-01-26
514
=head3 最初の行だけフェッチ(ハッシュ) C<fetch_hash_first()>
updated document
Yuki Kimoto authored on 2011-01-20
515

            
updated document
Yuki Kimoto authored on 2011-01-23
516
一行だけフェッチしてハッシュのリファレンスに格納するには
517
C<fetch_hash_first()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
518

            
519
    my $row = $result->fetch_hash_first;
520

            
update pod
Yuki Kimoto authored on 2011-02-04
521
ステートメントハンドルのC<finish()>が実行される
522
ので残りの行をフェッチできません。
updated document
Yuki Kimoto authored on 2011-01-20
523

            
update pod
Yuki Kimoto authored on 2011-02-04
524
=head3 複数行をフェッチ(ハッシュ) C<fetch_hash_multi()>
updated document
Yuki Kimoto authored on 2011-01-20
525

            
updated document
Yuki Kimoto authored on 2011-01-23
526
複数行をフェッチしてハッシュのリファレンスを要素に持つ
527
配列のリファレンスに格納するにはC<fetch_hash_multi()>
528
を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
529

            
530
    while (my $rows = $result->fetch_hash_multi(5)) {
updated document
Yuki Kimoto authored on 2011-01-23
531
        my $title0   = $rows->[0]{title};
532
        my $author0  = $rows->[0]{author};
533
        my $title1  = $rows->[1]{title};
534
        my $author1 = $rows->[1]{author};
updated document
Yuki Kimoto authored on 2011-01-20
535
    }
536

            
updated document
Yuki Kimoto authored on 2011-01-23
537
引数には取り出したい行数を指定します。
538

            
update pod
Yuki Kimoto authored on 2011-02-04
539
次のようなデータを取得できます。
updated document
Yuki Kimoto authored on 2011-01-23
540

            
541
    [
542
        {title => 'Perl', author => 'Ken'},
543
        {title => 'Ruby', author => 'Mark'}
544
    ]
545

            
update pod
Yuki Kimoto authored on 2011-01-26
546
=head3 すべての行をフェッチ(ハッシュ) C<fetch_hash_all()>
updated document
Yuki Kimoto authored on 2011-01-20
547

            
updated document
Yuki Kimoto authored on 2011-01-23
548
すべての行をフェッチしてハッシュのリファレンスを要素に持つ
549
配列のリファレンスに格納するにはC<fetch_hash_all()>
550
を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
551

            
552
    my $rows = $result->fetch_hash_all;
553

            
update pod
Yuki Kimoto authored on 2011-02-04
554
次のようなデータを取得できます。
updated document
Yuki Kimoto authored on 2011-01-23
555

            
556
    [
557
        {title => 'Perl', author => 'Ken'},
558
        {title => 'Ruby', author => 'Mark'}
559
    ]
560

            
update pod
Yuki Kimoto authored on 2011-01-26
561
=head3 ステートメントハンドル C<sth()>
updated document
Yuki Kimoto authored on 2011-01-23
562

            
update pod
Yuki Kimoto authored on 2011-02-04
563
ステートメントハンドル取得したい場合は
564
<sth()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
565

            
566
    my $sth = $result->sth;
567

            
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
568
=head2 4. フィルタリング
569

            
update pod
Yuki Kimoto authored on 2011-02-07
570
L<DBIx::Custom>は値のフィルタリング機能を提供します。
571

            
572
たとえば、データをデータベースに登録するときは
573
L<Time::Piece>オブジェクトからデータベースの日付のフォーマットに、
574
データベースからデータを取得するときは、
575
データベースの日付のフォーマットからL<Time::Piece>オブジェクト
576
に変換を行いたいと思うことでしょう。
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
577

            
update pod
Yuki Kimoto authored on 2011-01-26
578
=head3 フィルタの登録 C<register_filter()>
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
579

            
580
フィルタを登録するにはC<register_filter()>を使用します。
581

            
582
    $dbi->register_filter(
583
        # Time::Piece object to DATE format
584
        tp_to_date => sub {
585
            my $date = shift;
586

            
587
            return '0000-00-00' unless $tp;
588
            return $tp->strftime('%Y-%m-%d');
589
        },
590
        
591
        # DATE to Time::Piece object
592
        date_to_tp => sub {
593
            my $date = shift;
594

            
595
            return if $date eq '0000-00-00';
596
            return Time::Piece->strptime($date, '%Y-%m-%d');
597
        },
598
    );
599

            
600
登録したフィルタはC<apply_filter()>などで利用することができます。
601

            
update pod
Yuki Kimoto authored on 2011-01-26
602
=head3 フィルタの適用 C<apply_filter()>
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
603

            
604
作成したフィルタを適用するには、C<apply_filter()>を使用します。
605

            
606
    $dbi->apply_filter('book',
607
        issue_date => {out => 'tp_to_date', in => 'date_to_tp'},
608
        first_issue_date => {out => 'tp_to_date', in => 'date_to_tp'}
609
    );
610

            
update pod
Yuki Kimoto authored on 2011-02-07
611
第一引数はテーブル名です。第1引数より後の引数は、列名とフィルタルールのペアを記述します。
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
612
フィルタルールのoutには、データベースにデータを送信するときに適用するフィルタを、
613
フィルタルールのinには、データベースからデータを取得するときに適用するフィルタを
update pod
Yuki Kimoto authored on 2011-02-07
614
記述します。
615

            
616
フィルタとしてコードリファレンスを
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
617
指定することもできます。
618

            
619
    issue_date => {out => sub { ... }, in => sub { ... }}
620

            
621
適用されたフィルタはC<insert()>、C<update()>、C<update_all()>、C<delete()>、
622
C<delete_all()>、C<select()>で有効になります。
623

            
624
    my $tp = Time::Piece->strptime('2010/10/14', '%Y/%m/%d');
625
    my $result = $dbi->select(table => 'book', where => {issu_date => $tp});
626

            
627
データベースにデータが送信されるときに、L<Time::Piece>オブジェクトは
628
データベースの日付のフォーマット「2010-10-14」に変換されます。
629

            
update pod
Yuki Kimoto authored on 2011-02-07
630
データをフェッチするときには、データベースの日付のフォーマットは
631
L<Time::Piece>オブジェクトに変換されます。
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
632

            
633
    my $row = $resutl->fetch_hash_first;
634
    my $tp = $row->{issue_date};
635

            
update pod
Yuki Kimoto authored on 2011-02-07
636
テーブル名を含む列名を使用することもできます。
removed experimental expand
Yuki Kimoto authored on 2011-01-26
637

            
638
    $dbi->select(
639
        table => 'book',
640
        where => {'book.title' => 'Perl', 'book.author' => 'Ken'}
641
    );
642

            
update pod
Yuki Kimoto authored on 2011-02-11
643
フェッチを行う場合に"TABLE__COLUMN"という名前を使用した場合もフィルタは
644
有効になります。
645

            
646
    my $result = $dbi->execute(
647
       "select issue_date as book__issue_date from book");
648

            
649
C<in>フィルタの後に実行されるC<end>フィルタを適用することもできます。
650

            
651
    $dbi->apply_filter('book',
652
        issue_date => {out => 'tp_to_date', in => 'date_to_tp',
653
                       end => 'tp_to_displaydate'},
654
    );
655

            
update pod
Yuki Kimoto authored on 2011-02-07
656
=head3 個別のフィルタ C<filter>
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
657

            
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
658
個別にフィルタを適用することもできます。
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
659
個別のフィルタはC<apply_filter()>で適用したフィルタを上書きます。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
660

            
update pod
Yuki Kimoto authored on 2011-02-07
661
データを送信する場合に個別のフィルタを適用するには、C<filter>オプションを使用します。
662
このオプションはC<insert()>、C<update()>、
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
663
C<update_all()>、C<delete()>、C<delete_all()>、C<select()>、C<execute()>
664
で使用することができます。
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
665

            
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
666
    $dbi->insert(
667
        table => 'book',
668
        param => {issue_date => $tp, first_issue_date => $tp},
669
        filter => {issue_date => 'tp_to_date', first_issue_date => 'tp_to_date'}
670
    );
671

            
672
C<execute()>の例を示します。
673

            
674
my $sql = <<"EOS";
675
select YEAR(issue_date) as issue_year
676
from book
677
where YEAR(issue_date) = {? issue_year}
678
EOS
679
   
680
    my $result = $dbi->execute(
681
        $sql,
682
        param => {issue_year => '2010'},
683
        filter => {issue_year => 'tp_to_year'}
684
    );
685

            
update pod
Yuki Kimoto authored on 2011-02-07
686
行をフェッチするときにも個別のフィルタを適用することができます。
687
C<DBIx::Custom::Result>のC<filter()>を使用します。
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
688

            
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
689
    $result->filter(issue_year => 'year_to_tp');
690

            
update pod
Yuki Kimoto authored on 2011-02-07
691
=head3 最後のフィルタリング : C<end_filter()>
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
692

            
update pod
Yuki Kimoto authored on 2011-02-07
693
最後にもうひとつフィルタを追加することができます。
694
最終的な出力を作成する場合に便利です。
695
最後のフィルタを登録するにはC<end_filter()>を使用します。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
696

            
697
    $result->end_filter(issue_date => sub {
698
        my $tp = shift;
699
        
700
        return '' unless $tp;
701
        return $tp->strftime('%Y/%m/%d %h:%m:%s (%a)');
702
    });
703

            
update pod
Yuki Kimoto authored on 2011-02-07
704
この例ではL<Time::Piece>オブジェクトを読みやすい書式に変換しています。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
705

            
added experimental DBIx::Cus...
Yuki Kimoto authored on 2011-02-28
706
最後のフィルタリングをC<remove_filter()>で取り除くこともできます。
707

            
708
$result->remove_end_filter;
709

            
update pod
Yuki Kimoto authored on 2011-02-07
710
=head3 フィルタの適用の自動化 C<each_column()>
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
711

            
update pod
Yuki Kimoto authored on 2011-02-07
712
日付型の列は自動的にフィルタを適用できると便利です。
713
列のすべての情報を処理するためのC<each_column()>を利用することができます。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
714

            
715
    $dbi->each_column(
716
        sub {
717
            my ($self, $table, $column, $info) = @_;
718
            
719
            my $type = $info->{TYPE_NAME};
720
            
721
            my $filter = $type eq 'DATE'     ? {out => 'tp_to_date', in => 'date_to_tp'}
722
                       : $type eq 'DATETIME' ? {out => 'tp_to_datetime', in => 'datetime_to_tp'}
723
                                             : undef;
724
            
725
            $self->apply_filter($table, $column, $filter)
726
              if $filter;
727
        }
728
    );
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
729

            
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
730
each_columnはコールバックを受け取ります。コールバックの引数は
update pod
Yuki Kimoto authored on 2011-02-07
731
L<DBIx::Custom>オブジェクト、テーブル名、列名、列の情報です。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
732
列の型名の情報をもとに自動的に、フィルタを適用しています。
733

            
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
734
=head2 5. タグ
updated document
Yuki Kimoto authored on 2011-01-20
735

            
update pod
Yuki Kimoto authored on 2011-02-07
736
=head3 タグの基本
updated document
Yuki Kimoto authored on 2011-01-20
737

            
update pod
Yuki Kimoto authored on 2011-02-07
738
SQLの中にタグを埋め込むことができます。
updated document
Yuki Kimoto authored on 2011-01-20
739

            
update pod
Yuki Kimoto authored on 2011-01-26
740
    select * from book where {= title} and {like author};
updated document
Yuki Kimoto authored on 2011-01-20
741

            
update pod
Yuki Kimoto authored on 2011-01-26
742
{= title}と{like author}の部分がタグです。タグは次のような形式
743
を持ちます。
updated document
Yuki Kimoto authored on 2011-01-20
744

            
update pod
Yuki Kimoto authored on 2011-01-26
745
    {タグ名 引数1 引数2 ...}
746
    
747
タグはC<{>で始まり、C<}>で終わります。最初のC<{>とタグ名の間
748
には空白を挿入しないよう注意してください。
updated document
Yuki Kimoto authored on 2011-01-20
749

            
update pod
Yuki Kimoto authored on 2011-02-07
750
C<{>とC<}>は予約語になっています。
751
もし利用したい場合は\でエスケープを行う必要があります。
updated document
Yuki Kimoto authored on 2011-01-20
752

            
update pod
Yuki Kimoto authored on 2011-01-26
753
    select from book \\{ ... \\}
754

            
755
C<\>自体がPerlのエスケープ文字ですので、
update pod
Yuki Kimoto authored on 2011-02-07
756
C<\>は二つ必要になります。
update pod
Yuki Kimoto authored on 2011-01-26
757

            
update pod
Yuki Kimoto authored on 2011-02-07
758
タグはSQLが実行される前に展開されます。
update pod
Yuki Kimoto authored on 2011-01-26
759

            
760
    select * from book where title = ? and author like ?;
updated document
Yuki Kimoto authored on 2011-01-20
761

            
update pod
Yuki Kimoto authored on 2011-01-26
762
タグを含むSQLを実行するにはC<execute()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
763

            
update pod
Yuki Kimoto authored on 2011-01-26
764
    my $sql = "select * from book where {= author} and {like title};"
765
    $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'});
updated document
Yuki Kimoto authored on 2011-01-20
766

            
update pod
Yuki Kimoto authored on 2011-01-26
767
C<param>オプションを使って、プレースホルダに埋め込みたい値を
768
ハッシュリファレンスで指定することができます。
updated document
Yuki Kimoto authored on 2011-01-20
769

            
update pod
Yuki Kimoto authored on 2011-02-07
770
C<execute()>においてもC<filter>を指定することができます。
update pod
Yuki Kimoto authored on 2011-01-26
771

            
772
    $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'}
773
                  filter => {title => 'to_something');
774

            
update pod
Yuki Kimoto authored on 2011-02-07
775
C<execute>ではC<apply_filter()>で適用されたフィルタ
776
は有効ではないということに注意してください。
update pod
Yuki Kimoto authored on 2011-01-26
777
C<apply_filter()>で適用されたフィルタを有効にするには、
update pod
Yuki Kimoto authored on 2011-02-11
778
C<table>タグを利用します。
update pod
Yuki Kimoto authored on 2011-01-26
779

            
update pod
Yuki Kimoto authored on 2011-02-11
780
    my $sql = "select * from {table book} where {= author} and {like title};"
update pod
Yuki Kimoto authored on 2011-01-26
781

            
update pod
Yuki Kimoto authored on 2011-01-31
782
=head3 タグ一覧
update pod
Yuki Kimoto authored on 2011-01-26
783

            
update pod
Yuki Kimoto authored on 2011-02-11
784
=head4 C<table>
785

            
786
    {table NAME} -> NAME
787

            
788
これはSQLの中でテーブル名を指定する場合に利用します。
789
テーブル名を指定することによって、C<apply_filter()>
790
によるフィルタリングが有効になります。
791

            
update pod
Yuki Kimoto authored on 2011-01-31
792
=head4 C<?>
update pod
Yuki Kimoto authored on 2011-01-26
793

            
794
    {? NAME}    ->   ?
795

            
update pod
Yuki Kimoto authored on 2011-01-31
796
=head4 C<=>
update pod
Yuki Kimoto authored on 2011-01-26
797

            
798
    {= NAME}    ->   NAME = ?
799

            
update pod
Yuki Kimoto authored on 2011-01-31
800
=head4 C<E<lt>E<gt>>
update pod
Yuki Kimoto authored on 2011-01-26
801

            
802
    {<> NAME}   ->   NAME <> ?
803

            
update pod
Yuki Kimoto authored on 2011-01-31
804
=head4 C<E<lt>>
update pod
Yuki Kimoto authored on 2011-01-26
805

            
806
    {< NAME}    ->   NAME < ?
807

            
update pod
Yuki Kimoto authored on 2011-01-31
808
=head4 C<E<gt>>
update pod
Yuki Kimoto authored on 2011-01-26
809

            
810
    {> NAME}    ->   NAME > ?
811

            
update pod
Yuki Kimoto authored on 2011-01-31
812
=head4 C<E<gt>=>
update pod
Yuki Kimoto authored on 2011-01-26
813

            
814
    {>= NAME}   ->   NAME >= ?
815

            
update pod
Yuki Kimoto authored on 2011-01-31
816
=head4 C<E<lt>=>
update pod
Yuki Kimoto authored on 2011-01-26
817

            
818
    {<= NAME}   ->   NAME <= ?
819

            
update pod
Yuki Kimoto authored on 2011-01-31
820
=head4 C<like>
update pod
Yuki Kimoto authored on 2011-01-26
821

            
822
    {like NAME}   ->   NAME like ?
823

            
update pod
Yuki Kimoto authored on 2011-01-31
824
=head4 C<in>
update pod
Yuki Kimoto authored on 2011-01-26
825

            
826
    {in NAME COUNT}   ->   NAME in [?, ?, ..]
827

            
update pod
Yuki Kimoto authored on 2011-01-31
828
=head4 C<insert_param>
update pod
Yuki Kimoto authored on 2011-01-26
829

            
updated document
Yuki Kimoto authored on 2011-01-20
830
    {insert_param NAME1 NAME2}   ->   (NAME1, NAME2) values (?, ?)
update pod
Yuki Kimoto authored on 2011-01-26
831

            
update pod
Yuki Kimoto authored on 2011-01-31
832
=head4 C<update_param>
update pod
Yuki Kimoto authored on 2011-01-26
833

            
updated document
Yuki Kimoto authored on 2011-01-20
834
    {update_param NAME1 NAME2}   ->   set NAME1 = ?, NAME2 = ?
835

            
update pod
Yuki Kimoto authored on 2011-01-31
836
=head3 同名の列の扱い
updated document
Yuki Kimoto authored on 2011-01-20
837

            
update pod
Yuki Kimoto authored on 2011-02-07
838
同名の列を含むタグがある場合でも大丈夫です。
839
二つの日付で比較しなければならない場合を
update pod
Yuki Kimoto authored on 2011-01-26
840
考えて見ましょう。
updated document
Yuki Kimoto authored on 2011-01-20
841

            
update pod
Yuki Kimoto authored on 2011-01-26
842
    my $sql = "select * from table where {> date} and {< date};";
updated document
Yuki Kimoto authored on 2011-01-20
843

            
update pod
Yuki Kimoto authored on 2011-02-07
844
このような場合はパラメータの値を配列のリファレンスで指定します。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
845

            
update pod
Yuki Kimoto authored on 2011-01-26
846
    my $dbi->execute($sql, param => {date => ['2010-10-01', '2012-02-10']});
847

            
update pod
Yuki Kimoto authored on 2011-02-07
848
=head3 タグの登録 C<register_tag()>
update pod
Yuki Kimoto authored on 2011-01-26
849

            
update pod
Yuki Kimoto authored on 2011-02-07
850
独自のタグを登録することができます。
update pod
Yuki Kimoto authored on 2011-01-26
851
タグを追加するにはC<register_tag()>を使用します。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
852

            
853
    $dbi->register_tag(
update pod
Yuki Kimoto authored on 2011-01-26
854
        '=' => sub {
855
            my $column = shift;
856
            
857
            return ["$column = ?", [$column]];
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
858
        }
859
    );
860

            
update pod
Yuki Kimoto authored on 2011-01-26
861
ここではデフォルトのC<=>タグがどのように実装されているかを示しています。
update pod
Yuki Kimoto authored on 2011-02-11
862
タグの形式は次のようになっています。
update pod
Yuki Kimoto authored on 2011-01-26
863

            
update pod
Yuki Kimoto authored on 2011-02-11
864
    {タグ名 引数1 引数2 ...}
update pod
Yuki Kimoto authored on 2011-01-26
865

            
866
C<=>タグの場合は
867

            
868
    {= title}
869

            
870
という形式ですから、サブルーチンにはtitleというひとつの列名がわたってきます。
871

            
872
サブルーチンの戻り値には次の形式の配列のリファレンスを返す必要があります。
873

            
874
    [
875
        展開後の文字列,
876
        [プレースホルダに埋め込みに利用する列名1, 列名2, ...]
877
    ]
878

            
879
一つ目の要素は展開後の文字列です。この例では
880

            
881
    'title = ?'
882

            
883
を返す必要があります。
884

            
885
二つ目の要素はプレースホルダに埋め込みに利用する列名を含む配列の
886
リファレンスです。今回の例では
887

            
888
    ['title']
889

            
890
を返す必要があります。複数のプレースホルダを含む場合は、この部分が
update pod
Yuki Kimoto authored on 2011-02-11
891
複数になります。
update pod
Yuki Kimoto authored on 2011-01-26
892

            
893
上記を合わせると
894

            
895
    ['title = ?', ['title']]
896
    
897
を返す必要があるということです。
898

            
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
899
タグの実装の他のサンプルはL<DBIx::Custom::Tag>のソースコード
900
をご覧になってみてください。
901

            
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
902
=head2 6. Where句の動的な生成
903

            
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
904
=head3 Where句の動的な生成 where()
905

            
906
複数の検索条件を指定して、検索を行いたい場合があります。
907
次の3つのケースのwhere句を考えてみましょう。
908

            
909
titleの値だけで検索したい場合
910

            
911
    where {= title}
912

            
913
authorの値だけで検索したい場合
914

            
915
    where {= author}
916

            
917
titleとauthorの両方の値で検索したい場合
918

            
919
    where {= title} and {=author}
920

            
921
L<DBIx::Custom>では動的なWhere句の生成をサポートしています。
922
まずC<where()>でL<DBIx::Custom::Where>オブジェクトを生成します。
923

            
924
    my $where = $dbi->where;
925

            
926
次にC<clause()>を使用してwhere句を記述します。
927

            
928
    $where->clause(
929
        ['and', '{= title'}, '{= author}']
930
    );
931

            
932
clauseの指定方法は次のようになります。
933

            
934
    ['or' あるいは 'and', タグ1, タグ2, タグ3]
935

            
936
第一引数にはorあるいはandを指定します。第二引数以降には
937
検索条件をタグを使って記述します。
938

            
939
C<clause>の指定は入れ子にすることもでき、さらに複雑な条件
940
を記述することもできます。
941

            
942
    ['and', 
943
      '{= title}', 
944
      ['or', '{= author}', '{like date}']
945
    ]
946

            
update pod
Yuki Kimoto authored on 2011-02-11
947
これは "{=title} and ( {=author} or {like date} )" 意味しています。
948

            
949
C<clause>を設定した後にC<param>にパラメータを指定します。
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
950
    
update pod
Yuki Kimoto authored on 2011-02-11
951
    $where->param({title => 'Perl'});
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
952

            
953
この例ではtitleだけがパラメータに含まれています。
954

            
955
この後C<to_string()>を実行すると$paramに含まれるパラメータを満たす
956
where句を生成することができます。
957

            
958
    my $where_clause = $where->to_string;
959

            
960
パラメータはtitleだけですので、次のようなwhere句が生成されます。
961

            
962
    where {= title}
963

            
cleanup
Yuki Kimoto authored on 2011-01-26
964
またL<DBIx::Custom>は文字列の評価をオーバーロードして、C<to_string()>
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
965
を呼び出すようにしていますので、次のようにしてwhere句を生成することも
966
できます。
967

            
968
    my $where_clause = "$where";
969

            
970
これはSQLの中にwhere句を埋め込むときにとても役立つ機能です。
971

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
972
=head3 同一の列名を含む場合
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
973

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
974
タグの中に同一の名前を持つものが存在した場合でも動的に
975
where句を作成することができます。
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
976

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
977
たとえば、パラメータとして開始日付と終了日付を受け取ったことを
978
考えてみてください。
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
979

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
980
    my $param = {start_date => '2010-11-15', end_date => '2011-11-21'};
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
981

            
update pod
Yuki Kimoto authored on 2011-02-11
982
この場合はパラメータの値を配列のリファレンスにしてください。
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
983

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
984
    my $p = {date => ['2010-11-15', '2011-11-21']};
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
985

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
986
同名の列を含むタグに順番に埋め込むことができます。
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
987

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
988
    $where->clause(
989
        ['and', '{> date}', '{< date}']
990
    );
991
    $where->param($p);
992

            
993
また開始日付が存在しない場合は次のようなデータを作成します。
994

            
995
    my $p = {date => [$dbi->not_exists, '2011-11-21']};
996

            
update pod
Yuki Kimoto authored on 2011-02-11
997
C<not_exists()>でDBIx::Custom::NotExistsオブジェクトを
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
998
取得できます。これは対応する値が存在しないことを示すためのものです。
999

            
1000
また終了日付が存在しない場合は次のようなデータを作成します。
1001

            
1002
    my $p = {date => ['2010-11-15']};
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
1003

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
1004
どちらも存在しない場合は次のようなデータを作成します。
1005

            
1006
    my $p = {date => []};
1007

            
1008
少し難しいので一番簡単に作成できるロジックを示しておきます。
1009

            
1010
    my @date;
1011
    push @date, exists $param->{start_date} ? $param->{start_date}
1012
                                            : $dbi->not_exists;
1013
    push @date, $param->{end_date} if exists $param->{end_date};
1014
    my $p = {date => \@date};
1015

            
1016
=head3 C<select()>との連携
1017

            
update pod
Yuki Kimoto authored on 2011-01-26
1018
L<DBIx::Custom::Where>オブジェクトは
1019
C<select()>のC<where>に直接渡すことが
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
1020
できます。
1021
    
1022
    my $where = $dbi->where;
1023
    $where->clause(...);
1024
    $where->param($param);
1025
    my $result = $dbi->select(table => 'book', where => $where);
1026

            
update pod
Yuki Kimoto authored on 2011-01-26
1027
あるいはC<update()>、C<delete()>のwhereに指定することも可能です。
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
1028

            
1029
=head3 C<execute()>との連携
1030

            
1031
C<execute()>との連携です。SQLを作成するときに埋め込むことができます。
1032

            
1033

            
1034
    my $where = $dbi->where;
1035
    $where->clause(...);
1036
    $where->param($param);
1037

            
update pod
Yuki Kimoto authored on 2011-02-11
1038
    my $sql = <<"EOS";
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
1039
    select * from book;
1040
    $where
1041
    EOS
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
1042

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
1043
    $dbi->execute($sql, param => $param);
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
1044

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1045
=head2 7. モデル
update pod
Yuki Kimoto authored on 2011-01-28
1046

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1047
=head3 モデル
update pod
Yuki Kimoto authored on 2011-01-28
1048

            
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1049
ソースコードの見通しをよくするために、
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1050
L<DBIx::Custom::Model>を継承してモデルを作成することができます。
update pod
Yuki Kimoto authored on 2011-01-28
1051

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1052
まず最初にモデルの元になるクラスを<DBIx::Custom::Model>
1053
を継承して作成します。
update pod
Yuki Kimoto authored on 2011-01-28
1054

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1055
    package MyModel;
1056
    
1057
    use base 'DBIx::Custom::Model';
update pod
Yuki Kimoto authored on 2011-01-28
1058

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1059
次に個々のモデルクラスを作成します。
update pod
Yuki Kimoto authored on 2011-01-28
1060

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1061
MyModel::book
update pod
Yuki Kimoto authored on 2011-01-28
1062

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1063
    package MyModel::book;
1064
    
1065
    use base 'MyModel';
1066
    
1067
    sub insert { ... }
1068
    sub list { ... }
update pod
Yuki Kimoto authored on 2011-01-28
1069

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1070
MyModel::company
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1071

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1072
    package MyModel::company;
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1073
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1074
    use base 'MyModel';
1075
    
1076
    sub insert { ... }
1077
    sub list { ... }
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1078

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1079
このように作成したモジュールを次のように配置してください。
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1080

            
1081
    MyModel.pm
1082
    MyModel / book.pm
1083
            / company.pm
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1084

            
1085
このように作成したモデルはC<include_model()>で取り込むことができます。
1086

            
1087
    $dbi->include_model('MyModel');
1088

            
1089
第一引数は、モデルの名前空間になります。
1090

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1091
モデルは次のように利用することができます。
1092

            
1093
    my $result = $dbi->model('book')->list;
1094

            
1095
モデルではテーブル名を指定することなしに
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1096
C<insert()>, C<update()>, C<update_all()>,
1097
C<delete()>, C<delete_all()>, C<select()>などのメソッドを
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1098
利用できます。
update pod
Yuki Kimoto authored on 2011-01-28
1099

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1100
    $dbi->model('book')->insert(param => $param);
update pod
Yuki Kimoto authored on 2011-01-28
1101

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-21
1102
またモデルクラスでC<primary_key>の設定がなされていれば、
1103
プライマリキーを指定することなしに
update pod
Yuki Kimoto authored on 2011-02-28
1104
C<insert_at>, C<update_at()>, C<delete_at()>, C<select_at()>のメソッドを
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-21
1105
利用できます。
1106

            
1107
    $dbi->model('book')->delete_at(where => 123);
1108

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1109
モデルはL<DBIx::Custom::Model>です。
update pod
Yuki Kimoto authored on 2011-01-28
1110

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1111
必要であれば、C<table()>でテーブル名を取得することができます。
update pod
Yuki Kimoto authored on 2011-01-28
1112

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1113
    my $table = $model->table;
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1114

            
1115
L<DBIx::Custom>オブジェクトを取得することもできます。
1116

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1117
    my $dbi = $model->dbi;
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1118

            
1119
L<DBIx::Custom>とL<DBI>のすべてのメソッドを呼び出すこともできます。
update pod
Yuki Kimoto authored on 2011-01-28
1120

            
update pod
Yuki Kimoto authored on 2011-02-11
1121
    # DBIx::Custom method
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1122
    $model->execute($sql);
update pod
Yuki Kimoto authored on 2011-02-11
1123
    
1124
    # DBI method
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1125
    $model->begin_work;
1126
    $model->commit;
update pod
Yuki Kimoto authored on 2011-01-28
1127

            
add models() attribute
Yuki Kimoto authored on 2011-02-21
1128
すべてのモデル名を取得したい場合はC<models()>のキーを取得してください。
1129

            
1130
    my @models = keys %{$self->models};
1131

            
add DBIx::Custom::Model fore...
Yuki Kimoto authored on 2011-02-21
1132
モデルにはプライマリーキーを設定することもできます。
1133

            
1134
   $model->primary_key(['id', 'number_id']);
1135

            
update pod
Yuki Kimoto authored on 2011-02-28
1136
ここで設定したプライマリーキーはC<insert_at>, C<update_at()>, C<delete_at()>,
add DBIx::Custom::Model fore...
Yuki Kimoto authored on 2011-02-21
1137
C<select_at()>で利用されます。
1138

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1139
C<filter>でC<apply_filter()>で適用されるフィルタを定義しておくこともできます。
1140

            
1141
    $model->filter({
1142
        title  => {out => ..., in => ..., end => ...},
1143
        author => {out => ..., in => ..., end => ...}
1144
    });
1145

            
1146
このフィルタはC<include_model()>を呼び出したときに自動的に適用されます。
1147

            
add DBIx::Custom::Model colu...
Yuki Kimoto authored on 2011-02-21
1148
モデルには列名を設定することもできます。
1149

            
1150
    $model->columns(['id', 'number_id']);
1151

            
add experimental setup_model...
Yuki Kimoto authored on 2011-02-21
1152
列名はC<setup_model()>で自動的に設定することができます。
1153
このメソッドはC<include_model()>の後で呼び出してください。
1154

            
1155
    $dbi->setup_model;
1156

            
cleanup
Yuki Kimoto authored on 2011-02-22
1157
モデルにはリレーションを設定することもできます。
1158

            
1159
    $model->relation({'book.company_id' => 'company.id'});
1160

            
1161
ここで設定したリレーションはC<select()>, C<select_at()>で利用されます。
1162

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1163

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1164
=head2 クラス名、モデル名、テーブル名
1165

            
1166
クラス名とモデル名とテーブル名の関係について書いておきます。
1167
通常はクラス名がモデル名に利用され、テーブル名にはモデル名が利用されます。
1168

            
1169
    クラス名     モデル名              テーブル名
1170
    book         (クラス名) -> book    (モデル名) -> book
1171

            
1172
モデル名を変更することもできます。
1173

            
1174
    package MyModel::book;
1175
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1176
    use base 'MyModel';
1177
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1178
    __PACAKGE__->attr(name => 'book_model');
1179

            
1180
    クラス名     モデル名      テーブル名
1181
    book         book_model    (モデル名) -> book_model
1182

            
1183
モデル名というのは、L<DBIx::Custom>のL<model()>で利用される名前です。
1184

            
1185
    $dbi->model('book_model');
1186

            
1187
テーブル名を変更することもできます。
1188

            
1189
    package MyModel::book;
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1190

            
1191
    use base 'MyModel';
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1192
    
1193
    __PACAKGE__->attr(table => 'book_table');
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1194
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1195
    クラス名     モデル名              テーブル名
1196
    book         (クラス名) -> book    book_table
1197

            
1198
テーブル名というのは、実際にアクセスされるテーブルです。
1199

            
1200
    $dbi->model('book')->insert(...); # book_tableにアクセス
1201

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-22
1202
=head2 列名の自動生成 : column_clause()
1203

            
1204
列名の節を自動生成するにはC<column_clause()>を使用します。
1205
C<table>とC<columns>の値が利用されます。
1206

            
1207
    my $column_clause = $model->column_clause;
1208

            
1209
C<table>の値が'book'、C<column>の値が['id', 'name']で
1210
あった場合は次のような列名の節が生成されます。
1211

            
1212
    book.id as id, book.name as name
1213

            
1214
このように列名の節を生成するのは、列名のあいまいさをなくすためです。
1215

            
1216
不必要な列がある場合はC<remove>オプションで指定することができます。
1217

            
1218
    my $column_clause = $model->column_clause(remove => ['id']);
1219

            
1220
追加したい列がある場合は、C<add>オプションで追加することができます。
1221

            
1222
    my $column_clause = $model->column_clause(add => ['company.id as company__id']);
1223

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1224
=head2 モデルのサンプル
update pod
Yuki Kimoto authored on 2011-02-11
1225

            
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1226
モデルのサンプルです。
update pod
Yuki Kimoto authored on 2011-01-28
1227

            
1228
    package MyDBI;
1229
    
1230
    use base 'DBIx::Custom';
1231
    
1232
    sub connect {
1233
        my $self = shift->SUPER::connect(@_);
1234
        
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1235
        $self->include_model(
1236
            MyModel => [
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1237
                'book',
1238
                'company'
1239
            ]
update pod
Yuki Kimoto authored on 2011-01-28
1240
        );
1241
    }
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1242
    
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1243
    package MyModel::book;
1244
    use base 'DBIx::Custom::Model';
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1245
    
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
1246
    __PACKAGE__->attr('primary_key' => sub { ['id'] };
1247
    
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1248
    sub insert { ... }
1249
    sub list { ... }
1250
    
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1251
    package MyModel::company;
1252
    use base 'DBIx::Custom::Model';
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
1253

            
1254
    __PACKAGE__->attr('primary_key' => sub { ['id'] };
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1255
    
1256
    sub insert { ... }
1257
    sub list { ... }
update pod
Yuki Kimoto authored on 2011-01-28
1258

            
1259
=head2 8. パフォーマンスの改善
updated document
Yuki Kimoto authored on 2011-01-20
1260

            
update pod
Yuki Kimoto authored on 2011-01-26
1261
=head3 クエリの作成
updated document
Yuki Kimoto authored on 2011-01-20
1262

            
update pod
Yuki Kimoto authored on 2011-02-11
1263
パフォーマンスが得られない場合はC<query>オプションを使って
1264
クエリを作成してみてください。
update pod
Yuki Kimoto authored on 2011-01-26
1265

            
update pod
Yuki Kimoto authored on 2011-02-11
1266
    my $params = [
1267
        {title => 'Perl', author => 'Ken'},
1268
        {title => 'Good day', author => 'Tom'}
1269
    ]
1270
    my $query = $dbi->insert(table => 'book', param => $params->[0], query => 1);
update pod
Yuki Kimoto authored on 2011-01-26
1271

            
update pod
Yuki Kimoto authored on 2011-02-11
1272
戻り値はL<DBIx::Custom::Query>オブジェクトです。
1273
作成したクエリはC<execute()>で実行することができます。
update pod
Yuki Kimoto authored on 2011-01-26
1274

            
update pod
Yuki Kimoto authored on 2011-02-11
1275
    foreach my $param (@$params) {
1276
        $dbi->execute($query, $param);
1277
    }
1278

            
1279
ステートメントハンドルが再利用されるので、パフォーマンスが
1280
改善されます。
1281
C<query>オプションはC<insert()>, C<update()>, C<update_all()>,
1282
C<delete()>, C<delete_all()>で利用することができます.
1283

            
1284
クエリを作成するメソッドに渡すパラメータと
1285
C<execute()>に渡すパラメータの個数は同じでなければならない
1286
ことに注意してください。
1287

            
1288
C<create_query()>を使って任意のSQLのクエリを作成
update pod
Yuki Kimoto authored on 2011-01-26
1289
することもできます。
updated document
Yuki Kimoto authored on 2011-01-20
1290

            
1291
    my $query = $dbi->create_query(
update pod
Yuki Kimoto authored on 2011-01-26
1292
        "insert into book {insert_param title author};";
updated document
Yuki Kimoto authored on 2011-01-20
1293
    );
1294

            
1295

            
update pod
Yuki Kimoto authored on 2011-01-28
1296
=head2 9. その他の機能
updated document
Yuki Kimoto authored on 2011-01-20
1297

            
update pod
Yuki Kimoto authored on 2011-01-26
1298
=head3 メソッドの登録
updated document
Yuki Kimoto authored on 2011-01-20
1299

            
update pod
Yuki Kimoto authored on 2011-02-11
1300
L<DBIx::Custom>オブジェクトにメソッドを追加することができます。
update pod
Yuki Kimoto authored on 2011-02-11
1301
C<method()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
1302

            
update pod
Yuki Kimoto authored on 2011-01-26
1303
    $dbi->method(
updated document
Yuki Kimoto authored on 2011-01-20
1304
        update_or_insert => sub {
1305
            my $self = shift;
update pod
Yuki Kimoto authored on 2011-01-26
1306
            # something
updated document
Yuki Kimoto authored on 2011-01-20
1307
        },
1308
        find_or_create   => sub {
1309
            my $self = shift;
update pod
Yuki Kimoto authored on 2011-01-26
1310
            # something
updated document
Yuki Kimoto authored on 2011-01-20
1311
        }
1312
    );
1313

            
update pod
Yuki Kimoto authored on 2011-02-11
1314
これらのメソッドは
1315
L<DBIx::Custom>オブジェクトから呼び出すことができます。
updated document
Yuki Kimoto authored on 2011-01-20
1316

            
1317
    $dbi->update_or_insert;
1318
    $dbi->find_or_create;
1319

            
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1320
=head3 結果クラスの変更
1321

            
update pod
Yuki Kimoto authored on 2011-02-11
1322
結果クラスを変更することができます。
1323
デフォルトはL<DBIx::Custom::Result>です。
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1324

            
1325
    package MyResult;
1326
    use base 'DBIx::Custom::Result';
1327
    
1328
    sub some_method { ... }
updated document
Yuki Kimoto authored on 2011-01-20
1329

            
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1330
    1;
1331
    
1332
    package main;
1333
    
1334
    use MyResult;
1335
    
1336
    my $dbi = DBIx::Custom->connect(...);
1337
    $dbi->result_class('MyResult');
updated document
Yuki Kimoto authored on 2011-01-20
1338

            
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1339
=head3 キャッシング
updated document
Yuki Kimoto authored on 2011-01-20
1340

            
update pod
Yuki Kimoto authored on 2011-02-11
1341
タグの解析後のSQLはパフォーマンスの理由のためにキャッシュされます。
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1342
これはC<chace>で設定でき、デフォルトではキャッシュを行う設定です。
updated document
Yuki Kimoto authored on 2011-01-20
1343

            
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1344
    $dbi->cache(1);
updated document
Yuki Kimoto authored on 2011-01-20
1345

            
update pod
Yuki Kimoto authored on 2011-02-11
1346
キャッシュ方法はC<cache_method>で変更することができます。
1347
デフォルトのメソッドは以下のようになっていて、
1348
メモリ上にキャッシュが保存されます。
updated document
Yuki Kimoto authored on 2011-01-20
1349

            
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1350
    $dbi->cache_method(sub {
1351
        sub {
1352
            my $self = shift;
1353
            
1354
            $self->{_cached} ||= {};
1355
            
1356
            if (@_ > 1) {
update pod
Yuki Kimoto authored on 2011-02-11
1357
                # キャッシュの保存
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1358
                $self->{_cached}{$_[0]} = $_[1] 
1359
            }
1360
            else {
update pod
Yuki Kimoto authored on 2011-02-11
1361
                # キャッシュの取得
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1362
                return $self->{_cached}{$_[0]}
1363
            }
1364
        }
1365
    });
1366
    
1367
第一はL<DBIx::Custom>オブジェクトです。
update pod
Yuki Kimoto authored on 2011-02-11
1368
第二引数はタグが解析される前のSQLです。
1369
第三引数はタグの解析後のSQLの情報です。これはハッシュのリファレンスです。
updated document
Yuki Kimoto authored on 2011-01-20
1370

            
update pod
Yuki Kimoto authored on 2011-02-11
1371
第三引数が存在した場合はキャッシュを設定し、
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1372
存在しなかった場合はキャッシュを取得する実装に
1373
してください。
updated document
Yuki Kimoto authored on 2011-01-20
1374

            
update pod
Yuki Kimoto authored on 2011-02-11
1375
=head1 サンプル
1376

            
1377
以下のWikiでサンプルを見ることができます。
1378

            
1379
L<DBIx::Custom Wiki|https://github.com/yuki-kimoto/DBIx-Custom/wiki>
1380

            
updated document
Yuki Kimoto authored on 2011-01-20
1381
=cut