Newer Older
1406 lines | 44.503kb
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

            
selection can contain where ...
Yuki Kimoto authored on 2011-03-06
9
(このモジュールはまだ実験的な機能を多く含んでいます
10
モジュールのドキュメントにexperimentalがついているものは、
11
予告なしに変更されることがあります。)
12

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

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

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

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

            
34
    select * from book where {= title} and {=author};
35

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

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

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

            
updated document
Yuki Kimoto authored on 2011-01-20
45
=over 4
updated document
Yuki Kimoto authored on 2011-01-20
46

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

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

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

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

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

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

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

            
71
まずフィルタを登録します。
72

            
73
    $dbi->register_filter(
74
        tp_to_date => sub {
75
            ...
76
        },
77
        date_to_tp => sub {
78
            ...
79
        }
80
    );
81

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

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

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

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

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

            
94
=item 3. 選択的な検索条件
95

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

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

            
100
    select * from book where title = ? and author = ?;
101

            
102
titleだけの場合は次のSQLを
103

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

            
108
    select * from book where author = ?;
109

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

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

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

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

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

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

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

            
139
    my $param = {title => 'Perl', author => 'Ken'};
140
    $dbi->insert(table => 'book', param => $param);
141

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

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

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

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

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

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

            
updated document
Yuki Kimoto authored on 2011-01-20
162
=back
163

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

            
167
=head2 1. データベースへの接続
168

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

            
171
    use DBIx::Custom;
172

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

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

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

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

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

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

            
193
    "dbi:SQLite:dbname=$database"
194
    "dbi:SQLite:dbname=:memory:"
195

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

            
198
    "dbi:Pg:dbname=$dbname"
199

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

            
202
    "dbi:Oracle:$dbname"
203
    "dbi:Oracle:host=$host;sid=$sid"
204

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

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

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

            
211
   "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
212

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

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

            
218
    my $dbh = $dbi->dbh;
219

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            
300
    while (my $row = $result->fetch) {
301
        my $title  = $row->[0];
302
        my $author = $row->[1];
303
    }
304

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

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

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

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

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

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

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

            
323
    my $result = $dbi->select(
cleanup
Yuki Kimoto authored on 2011-03-10
324
        table  => 'book',
325
        column => ['company.name as company__name']
326
        where  => {'book.name' => 'Perl'},
327
        join   => ['left outer join company on book.company_id = company.id]
added experimental expand me...
yuki-kimoto authored on 2010-10-20
328
    );
329

            
cleanup
Yuki Kimoto authored on 2011-03-10
330
C<join>でテーブルの結合を行うことができます。
update pod
Yuki Kimoto authored on 2011-01-31
331

            
332
次のSQLが実行されます。
333

            
cleanup
Yuki Kimoto authored on 2011-03-10
334
    select company.name as company__name from book
335
      left outer join company on book.company_id = company.id
336
      where book.name = ?;
337

            
338
bookテーブルのcompany_id列とcompanyテーブルのidが左外部結合されます。
339
次のSQLが実行されます。
340

            
341
C<join>されるのは、C<where>やC<column>にテーブル名が含まれている
342
場合だけであることに注意してください。
343
次のように指定した場合は結合の必要はないと判断されjoinはされません。
344

            
345
    my $result = $dbi->select(
346
        table  => 'book',
347
        where  => {'name' => 'Perl'},
348
        join   => ['left outer join company on book.company_id = company.id]
349
    );
350

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

            
cleanup
Yuki Kimoto authored on 2011-03-10
353
    select * from book where book.name = ?;
added experimental expand me...
yuki-kimoto authored on 2010-10-20
354

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

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

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

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

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

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

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

            
380
    $dbi->select(selection => $selection);
381

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

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

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

            
389
    $dbi->execute("select * from book;");
390

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

            
393
    $dbi->execute(
394
        "select * from book {= title} and {= author};"
395
        param => {title => 'Perl', author => 'Ken'}
396
    );
397

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

            
400
    select * from book title = ? and author = ?;
401

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

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

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

            
408
    $dbi->execute('select * from book');
409

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

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

            
414
    $dbi->insert_at(
415
        table => 'book', primary_key => ['id'],
416
        where => ['123'], param => {name => 'Ken'}
417
    );
418

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

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

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

            
427
    $dbi->update_at(
428
        table => 'book', primary_key => ['id'],
429
        where => ['123'], param => {name => 'Ken'}
430
    );
431

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            
updated document
Yuki Kimoto authored on 2011-01-20
475
    while (my $row = $result->fetch) {
updated document
Yuki Kimoto authored on 2011-01-23
476
        my $title  = $row->[0];
477
        my $author = $row->[1];
updated document
Yuki Kimoto authored on 2011-01-20
478
    }
479

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

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

            
485
    my $row = $result->fetch_first;
486

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

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

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

            
updated document
Yuki Kimoto authored on 2011-01-23
495
    while (my $rows = $result->fetch_multi(2)) {
496
        my $title0   = $rows->[0][0];
497
        my $author0  = $rows->[0][1];
498
        
499
        my $title1   = $rows->[1][0];
500
        my $author1  = $rows->[1][1];
updated document
Yuki Kimoto authored on 2011-01-20
501
    }
502

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

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

            
507
    [
508
        ['Perl', 'Ken'],
509
        ['Ruby', 'Mark']
510
    ]
511

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

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

            
517
    my $rows = $result->fetch_all;
518

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

            
521
    [
522
        ['Perl', 'Ken'],
523
        ['Ruby', 'Mark']
524
    ]
525

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

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

            
530
    while (my $row = $result->fetch_hash) {
531
        my $title  = $row->{title};
532
        my $author = $row->{author};
533
    }
534

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

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

            
540
    my $row = $result->fetch_hash_first;
541

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

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

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

            
551
    while (my $rows = $result->fetch_hash_multi(5)) {
updated document
Yuki Kimoto authored on 2011-01-23
552
        my $title0   = $rows->[0]{title};
553
        my $author0  = $rows->[0]{author};
554
        my $title1  = $rows->[1]{title};
555
        my $author1 = $rows->[1]{author};
updated document
Yuki Kimoto authored on 2011-01-20
556
    }
557

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

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

            
562
    [
563
        {title => 'Perl', author => 'Ken'},
564
        {title => 'Ruby', author => 'Mark'}
565
    ]
566

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

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

            
573
    my $rows = $result->fetch_hash_all;
574

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

            
577
    [
578
        {title => 'Perl', author => 'Ken'},
579
        {title => 'Ruby', author => 'Mark'}
580
    ]
581

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

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

            
587
    my $sth = $result->sth;
588

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

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

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

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

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

            
603
    $dbi->register_filter(
604
        # Time::Piece object to DATE format
605
        tp_to_date => sub {
606
            my $date = shift;
607

            
608
            return '0000-00-00' unless $tp;
609
            return $tp->strftime('%Y-%m-%d');
610
        },
611
        
612
        # DATE to Time::Piece object
613
        date_to_tp => sub {
614
            my $date = shift;
615

            
616
            return if $date eq '0000-00-00';
617
            return Time::Piece->strptime($date, '%Y-%m-%d');
618
        },
619
    );
620

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

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

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

            
627
    $dbi->apply_filter('book',
628
        issue_date => {out => 'tp_to_date', in => 'date_to_tp'},
629
        first_issue_date => {out => 'tp_to_date', in => 'date_to_tp'}
630
    );
631

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

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

            
640
    issue_date => {out => sub { ... }, in => sub { ... }}
641

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

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

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

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

            
654
    my $row = $resutl->fetch_hash_first;
655
    my $tp = $row->{issue_date};
656

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

            
659
    $dbi->select(
660
        table => 'book',
661
        where => {'book.title' => 'Perl', 'book.author' => 'Ken'}
662
    );
663

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

            
667
    my $result = $dbi->execute(
668
       "select issue_date as book__issue_date from book");
669

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

            
672
    $dbi->apply_filter('book',
673
        issue_date => {out => 'tp_to_date', in => 'date_to_tp',
674
                       end => 'tp_to_displaydate'},
675
    );
676

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

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

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

            
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
687
    $dbi->insert(
688
        table => 'book',
689
        param => {issue_date => $tp, first_issue_date => $tp},
690
        filter => {issue_date => 'tp_to_date', first_issue_date => 'tp_to_date'}
691
    );
692

            
693
C<execute()>の例を示します。
694

            
695
my $sql = <<"EOS";
696
select YEAR(issue_date) as issue_year
697
from book
698
where YEAR(issue_date) = {? issue_year}
699
EOS
700
   
701
    my $result = $dbi->execute(
702
        $sql,
703
        param => {issue_year => '2010'},
704
        filter => {issue_year => 'tp_to_year'}
705
    );
706

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

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

            
selection can contain where ...
Yuki Kimoto authored on 2011-03-06
712
C<remove_filter()>でフィルタを取り除くこともできます。
713

            
714
    $result->remove_filter
715

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

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

            
722
    $result->end_filter(issue_date => sub {
723
        my $tp = shift;
724
        
725
        return '' unless $tp;
726
        return $tp->strftime('%Y/%m/%d %h:%m:%s (%a)');
727
    });
728

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

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

            
733
$result->remove_end_filter;
734

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

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

            
740
    $dbi->each_column(
741
        sub {
742
            my ($self, $table, $column, $info) = @_;
743
            
744
            my $type = $info->{TYPE_NAME};
745
            
746
            my $filter = $type eq 'DATE'     ? {out => 'tp_to_date', in => 'date_to_tp'}
747
                       : $type eq 'DATETIME' ? {out => 'tp_to_datetime', in => 'datetime_to_tp'}
748
                                             : undef;
749
            
750
            $self->apply_filter($table, $column, $filter)
751
              if $filter;
752
        }
753
    );
renamed dbi_options to dbi_o...
Yuki Kimoto authored on 2011-01-23
754

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            
797
    $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'}
798
                  filter => {title => 'to_something');
799

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

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

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

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

            
811
    {table NAME} -> NAME
812

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

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

            
819
    {? NAME}    ->   ?
820

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

            
823
    {= NAME}    ->   NAME = ?
824

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

            
827
    {<> NAME}   ->   NAME <> ?
828

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

            
831
    {< NAME}    ->   NAME < ?
832

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

            
835
    {> NAME}    ->   NAME > ?
836

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

            
839
    {>= NAME}   ->   NAME >= ?
840

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

            
843
    {<= NAME}   ->   NAME <= ?
844

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

            
847
    {like NAME}   ->   NAME like ?
848

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

            
851
    {in NAME COUNT}   ->   NAME in [?, ?, ..]
852

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

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

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

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

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

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

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

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

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

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

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

            
878
    $dbi->register_tag(
update pod
Yuki Kimoto authored on 2011-01-26
879
        '=' => sub {
880
            my $column = shift;
881
            
882
            return ["$column = ?", [$column]];
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
883
        }
884
    );
885

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

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

            
891
C<=>タグの場合は
892

            
893
    {= title}
894

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

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

            
899
    [
900
        展開後の文字列,
901
        [プレースホルダに埋め込みに利用する列名1, 列名2, ...]
902
    ]
903

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

            
906
    'title = ?'
907

            
908
を返す必要があります。
909

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

            
913
    ['title']
914

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

            
918
上記を合わせると
919

            
920
    ['title = ?', ['title']]
921
    
922
を返す必要があるということです。
923

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

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

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

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

            
934
titleの値だけで検索したい場合
935

            
936
    where {= title}
937

            
938
authorの値だけで検索したい場合
939

            
940
    where {= author}
941

            
942
titleとauthorの両方の値で検索したい場合
943

            
944
    where {= title} and {=author}
945

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

            
949
    my $where = $dbi->where;
950

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

            
953
    $where->clause(
954
        ['and', '{= title'}, '{= author}']
955
    );
956

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

            
959
    ['or' あるいは 'and', タグ1, タグ2, タグ3]
960

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

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

            
967
    ['and', 
968
      '{= title}', 
969
      ['or', '{= author}', '{like date}']
970
    ]
971

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

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

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

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

            
983
    my $where_clause = $where->to_string;
984

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

            
987
    where {= title}
988

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

            
993
    my $where_clause = "$where";
994

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

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

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

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

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

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

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

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

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
1013
    $where->clause(
1014
        ['and', '{> date}', '{< date}']
1015
    );
1016
    $where->param($p);
1017

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

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

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

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

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

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

            
1031
    my $p = {date => []};
1032

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

            
1035
    my @date;
1036
    push @date, exists $param->{start_date} ? $param->{start_date}
1037
                                            : $dbi->not_exists;
1038
    push @date, $param->{end_date} if exists $param->{end_date};
1039
    my $p = {date => \@date};
1040

            
1041
=head3 C<select()>との連携
1042

            
update pod
Yuki Kimoto authored on 2011-01-26
1043
L<DBIx::Custom::Where>オブジェクトは
1044
C<select()>のC<where>に直接渡すことが
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
1045
できます。
1046
    
1047
    my $where = $dbi->where;
1048
    $where->clause(...);
1049
    $where->param($param);
1050
    my $result = $dbi->select(table => 'book', where => $where);
1051

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

            
1054
=head3 C<execute()>との連携
1055

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

            
1058

            
1059
    my $where = $dbi->where;
1060
    $where->clause(...);
1061
    $where->param($param);
1062

            
update pod
Yuki Kimoto authored on 2011-02-11
1063
    my $sql = <<"EOS";
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
1064
    select * from book;
1065
    $where
1066
    EOS
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
1067

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

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

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

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

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

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1080
    package MyModel;
1081
    
1082
    use base 'DBIx::Custom::Model';
update pod
Yuki Kimoto authored on 2011-01-28
1083

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

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

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1088
    package MyModel::book;
1089
    
1090
    use base 'MyModel';
1091
    
1092
    sub insert { ... }
1093
    sub list { ... }
update pod
Yuki Kimoto authored on 2011-01-28
1094

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

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1097
    package MyModel::company;
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1098
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1099
    use base 'MyModel';
1100
    
1101
    sub insert { ... }
1102
    sub list { ... }
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1103

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

            
1106
    MyModel.pm
1107
    MyModel / book.pm
1108
            / company.pm
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1109

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

            
1112
    $dbi->include_model('MyModel');
1113

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

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

            
1118
    my $result = $dbi->model('book')->list;
1119

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

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

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

            
1132
    $dbi->model('book')->delete_at(where => 123);
1133

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

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

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

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

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

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

            
update pod
Yuki Kimoto authored on 2011-02-11
1146
    # DBIx::Custom method
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1147
    $model->execute($sql);
update pod
Yuki Kimoto authored on 2011-02-11
1148
    
1149
    # DBI method
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1150
    $model->begin_work;
1151
    $model->commit;
update pod
Yuki Kimoto authored on 2011-01-28
1152

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

            
1155
    my @models = keys %{$self->models};
1156

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

            
1159
   $model->primary_key(['id', 'number_id']);
1160

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

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

            
1166
    $model->filter({
1167
        title  => {out => ..., in => ..., end => ...},
1168
        author => {out => ..., in => ..., end => ...}
1169
    });
1170

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

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

            
1175
    $model->columns(['id', 'number_id']);
1176

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

            
1180
    $dbi->setup_model;
1181

            
cleanup
Yuki Kimoto authored on 2011-03-10
1182
モデルにはC<join>を設定することもできます。
cleanup
Yuki Kimoto authored on 2011-02-22
1183

            
cleanup
Yuki Kimoto authored on 2011-03-10
1184
    $model->join(['left outer join company on book.company_id = company.id']);
cleanup
Yuki Kimoto authored on 2011-02-22
1185

            
cleanup
Yuki Kimoto authored on 2011-03-10
1186
ここで設定したC<join>はC<select()>, C<select_at()>で利用されます。
cleanup
Yuki Kimoto authored on 2011-02-22
1187

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

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

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

            
1194
    クラス名     モデル名              テーブル名
1195
    book         (クラス名) -> book    (モデル名) -> book
1196

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

            
1199
    package MyModel::book;
1200
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1201
    use base 'MyModel';
1202
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1203
    __PACAKGE__->attr(name => 'book_model');
1204

            
1205
    クラス名     モデル名      テーブル名
1206
    book         book_model    (モデル名) -> book_model
1207

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

            
1210
    $dbi->model('book_model');
1211

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

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

            
1216
    use base 'MyModel';
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1217
    
1218
    __PACAKGE__->attr(table => 'book_table');
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1219
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1220
    クラス名     モデル名              テーブル名
1221
    book         (クラス名) -> book    book_table
1222

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

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

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

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

            
1232
    my $column_clause = $model->column_clause;
1233

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

            
1237
    book.id as id, book.name as name
1238

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

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

            
1243
    my $column_clause = $model->column_clause(remove => ['id']);
1244

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

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

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

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

            
1253
    package MyDBI;
1254
    
1255
    use base 'DBIx::Custom';
1256
    
1257
    sub connect {
1258
        my $self = shift->SUPER::connect(@_);
1259
        
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1260
        $self->include_model(
1261
            MyModel => [
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1262
                'book',
1263
                'company'
1264
            ]
update pod
Yuki Kimoto authored on 2011-01-28
1265
        );
1266
    }
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1267
    
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1268
    package MyModel::book;
1269
    use base 'DBIx::Custom::Model';
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1270
    
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
1271
    __PACKAGE__->attr('primary_key' => sub { ['id'] };
1272
    
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1273
    sub insert { ... }
1274
    sub list { ... }
1275
    
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1276
    package MyModel::company;
1277
    use base 'DBIx::Custom::Model';
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
1278

            
1279
    __PACKAGE__->attr('primary_key' => sub { ['id'] };
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1280
    
1281
    sub insert { ... }
1282
    sub list { ... }
update pod
Yuki Kimoto authored on 2011-01-28
1283

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

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

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

            
update pod
Yuki Kimoto authored on 2011-02-11
1291
    my $params = [
1292
        {title => 'Perl', author => 'Ken'},
1293
        {title => 'Good day', author => 'Tom'}
1294
    ]
1295
    my $query = $dbi->insert(table => 'book', param => $params->[0], query => 1);
update pod
Yuki Kimoto authored on 2011-01-26
1296

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

            
update pod
Yuki Kimoto authored on 2011-02-11
1300
    foreach my $param (@$params) {
1301
        $dbi->execute($query, $param);
1302
    }
1303

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

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

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

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

            
1320

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

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

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

            
update pod
Yuki Kimoto authored on 2011-01-26
1328
    $dbi->method(
updated document
Yuki Kimoto authored on 2011-01-20
1329
        update_or_insert => sub {
1330
            my $self = shift;
update pod
Yuki Kimoto authored on 2011-01-26
1331
            # something
updated document
Yuki Kimoto authored on 2011-01-20
1332
        },
1333
        find_or_create   => sub {
1334
            my $self = shift;
update pod
Yuki Kimoto authored on 2011-01-26
1335
            # something
updated document
Yuki Kimoto authored on 2011-01-20
1336
        }
1337
    );
1338

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

            
1342
    $dbi->update_or_insert;
1343
    $dbi->find_or_create;
1344

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

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

            
1350
    package MyResult;
1351
    use base 'DBIx::Custom::Result';
1352
    
1353
    sub some_method { ... }
updated document
Yuki Kimoto authored on 2011-01-20
1354

            
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1355
    1;
1356
    
1357
    package main;
1358
    
1359
    use MyResult;
1360
    
1361
    my $dbi = DBIx::Custom->connect(...);
1362
    $dbi->result_class('MyResult');
updated document
Yuki Kimoto authored on 2011-01-20
1363

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

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

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

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

            
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1375
    $dbi->cache_method(sub {
1376
        sub {
1377
            my $self = shift;
1378
            
1379
            $self->{_cached} ||= {};
1380
            
1381
            if (@_ > 1) {
update pod
Yuki Kimoto authored on 2011-02-11
1382
                # キャッシュの保存
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1383
                $self->{_cached}{$_[0]} = $_[1] 
1384
            }
1385
            else {
update pod
Yuki Kimoto authored on 2011-02-11
1386
                # キャッシュの取得
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1387
                return $self->{_cached}{$_[0]}
1388
            }
1389
        }
1390
    });
1391
    
1392
第一はL<DBIx::Custom>オブジェクトです。
update pod
Yuki Kimoto authored on 2011-02-11
1393
第二引数はタグが解析される前のSQLです。
1394
第三引数はタグの解析後のSQLの情報です。これはハッシュのリファレンスです。
updated document
Yuki Kimoto authored on 2011-01-20
1395

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

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

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

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

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