Newer Older
1254 lines | 40.538kb
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 pod
Yuki Kimoto authored on 2011-06-07
27
L<DBIx::Custom>では、パラメーターと呼ばれるものを
updated document
Yuki Kimoto authored on 2011-01-20
28
SQLの中に埋め込むことができます。
29

            
updated pod
Yuki Kimoto authored on 2011-06-07
30
    select * from book where title = :title and author = :author;
updated document
Yuki Kimoto authored on 2011-01-20
31

            
updated pod
Yuki Kimoto authored on 2011-06-07
32
:titleや:authorがパラメーターです。このSQLは実際に実行されるときには
updated document
Yuki Kimoto authored on 2011-01-20
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(
updated pod
Yuki Kimoto authored on 2011-06-07
116
        ['and', 'title = :title', 'author = :author']
updated document
Yuki Kimoto authored on 2011-01-20
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(
data_source is DEPRECATED! I...
Yuki Kimoto authored on 2011-06-06
173
        dsn => "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

            
data_source is DEPRECATED! I...
Yuki Kimoto authored on 2011-06-06
179
C<dsn>はデータベースシステムに応じたものである必要があります。
update pod
Yuki Kimoto authored on 2011-01-30
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(
cleanup
Yuki Kimoto authored on 2011-03-10
320
        table  => 'book',
321
        column => ['company.name as company__name']
322
        where  => {'book.name' => 'Perl'},
323
        join   => ['left outer join company on book.company_id = company.id]
added experimental expand me...
yuki-kimoto authored on 2010-10-20
324
    );
325

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

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

            
cleanup
Yuki Kimoto authored on 2011-03-21
330
    select company.name as company__name
331
    from book
cleanup
Yuki Kimoto authored on 2011-03-10
332
      left outer join company on book.company_id = company.id
cleanup
Yuki Kimoto authored on 2011-03-21
333
    where book.name = ?;
cleanup
Yuki Kimoto authored on 2011-03-10
334

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

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

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

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

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

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

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

            
cleanup
Yuki Kimoto authored on 2011-03-21
360
C<mycolumn()>やC<column()>を使用すると簡単に列名を指定できます。
361

            
362
    my $result = $dbi->select(
363
        table  => 'book',
364
        column => [
365
            $dbi->mycolumn('book' => ['name']),
366
            $dbi->column('company' => ['id', 'name'])
367
        ],
368
        join   => ['left outer join company on book.company_id = company.id]
369
    );
370

            
371
次のSQLが実行されます。
372

            
373
    select book.name as name,
374
      company.id as comapny__id,
375
      company.name as company__name
376
    from book
377
      left outer join company on book.company_id = company.id
378

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

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

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

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

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

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

            
392
    $dbi->execute("select * from book;");
393

            
updated pod
Yuki Kimoto authored on 2011-06-07
394
パラメーターを処理してSQLを実行します。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
395

            
396
    $dbi->execute(
updated pod
Yuki Kimoto authored on 2011-06-07
397
        "select * from book title = :title and author = :author;"
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
398
        param => {title => 'Perl', author => 'Ken'}
399
    );
400

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

            
403
    select * from book title = ? and author = ?;
404

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

            
updated pod
Yuki Kimoto authored on 2011-06-07
407
パラメーターについてはL<5. パラメーター/"5. パラメーター">を見てください。
removed experimental txn_sco...
Yuki Kimoto authored on 2011-01-24
408

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

            
411
    $dbi->execute('select * from book');
412

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            
488
    my $row = $result->fetch_first;
489

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

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

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

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

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

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

            
510
    [
511
        ['Perl', 'Ken'],
512
        ['Ruby', 'Mark']
513
    ]
514

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

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

            
520
    my $rows = $result->fetch_all;
521

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

            
524
    [
525
        ['Perl', 'Ken'],
526
        ['Ruby', 'Mark']
527
    ]
528

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

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

            
533
    while (my $row = $result->fetch_hash) {
534
        my $title  = $row->{title};
535
        my $author = $row->{author};
536
    }
537

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

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

            
543
    my $row = $result->fetch_hash_first;
544

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

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

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

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

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

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

            
565
    [
566
        {title => 'Perl', author => 'Ken'},
567
        {title => 'Ruby', author => 'Mark'}
568
    ]
569

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

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

            
576
    my $rows = $result->fetch_hash_all;
577

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

            
580
    [
581
        {title => 'Perl', author => 'Ken'},
582
        {title => 'Ruby', author => 'Mark'}
583
    ]
584

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

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

            
590
    my $sth = $result->sth;
591

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

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

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

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

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

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

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

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

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

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

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

            
630
    $dbi->apply_filter('book',
631
        issue_date => {out => 'tp_to_date', in => 'date_to_tp'},
632
        first_issue_date => {out => 'tp_to_date', in => 'date_to_tp'}
633
    );
634

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

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

            
643
    issue_date => {out => sub { ... }, in => sub { ... }}
644

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

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

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

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

            
657
    my $row = $resutl->fetch_hash_first;
658
    my $tp = $row->{issue_date};
659

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

            
662
    $dbi->select(
663
        table => 'book',
664
        where => {'book.title' => 'Perl', 'book.author' => 'Ken'}
665
    );
666

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

            
670
    my $result = $dbi->execute(
671
       "select issue_date as book__issue_date from book");
672

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

            
675
    $dbi->apply_filter('book',
676
        issue_date => {out => 'tp_to_date', in => 'date_to_tp',
677
                       end => 'tp_to_displaydate'},
678
    );
679

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

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

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

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

            
696
C<execute()>の例を示します。
697

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

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

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

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

            
717
    $result->remove_filter
718

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

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

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

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

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

            
736
$result->remove_end_filter;
737

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

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

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

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

            
updated pod
Yuki Kimoto authored on 2011-06-07
762
=head2 5. パラメーター
updated document
Yuki Kimoto authored on 2011-01-20
763

            
updated pod
Yuki Kimoto authored on 2011-06-07
764
=head3 パラメーターの基本
updated document
Yuki Kimoto authored on 2011-01-20
765

            
updated pod
Yuki Kimoto authored on 2011-06-07
766
SQLの中にパラメーターを埋め込むことができます。
updated document
Yuki Kimoto authored on 2011-01-20
767

            
updated pod
Yuki Kimoto authored on 2011-06-07
768
    select * from book where title = :title and author like :author;
updated document
Yuki Kimoto authored on 2011-01-20
769

            
updated pod
Yuki Kimoto authored on 2011-06-07
770
:titleと:authorの部分がパラメーターです。
update pod
Yuki Kimoto authored on 2011-01-26
771
    
updated pod
Yuki Kimoto authored on 2011-06-07
772
パラメーターはSQLが実行される前に展開されます。
update pod
Yuki Kimoto authored on 2011-01-26
773

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

            
updated pod
Yuki Kimoto authored on 2011-06-07
776
パラメーターを含むSQLを実行するにはC<execute()>を使用します。
updated document
Yuki Kimoto authored on 2011-01-20
777

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

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

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

            
786
    $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'}
787
                  filter => {title => 'to_something');
788

            
update pod
Yuki Kimoto authored on 2011-02-07
789
C<execute>ではC<apply_filter()>で適用されたフィルタ
790
は有効ではないということに注意してください。
update pod
Yuki Kimoto authored on 2011-01-26
791
C<apply_filter()>で適用されたフィルタを有効にするには、
improved table search in col...
Yuki Kimoto authored on 2011-04-12
792
C<table>オプションを利用します。
update pod
Yuki Kimoto authored on 2011-01-26
793

            
improved table search in col...
Yuki Kimoto authored on 2011-04-12
794
    $dbi->execute($sql, table => ['author', 'book']);
update pod
Yuki Kimoto authored on 2011-01-26
795

            
improved table search in col...
Yuki Kimoto authored on 2011-04-12
796
後ろで適用したフィルタのほうが優先順位が高くなります。
update pod
Yuki Kimoto authored on 2011-02-11
797

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

            
updated pod
Yuki Kimoto authored on 2011-06-07
800
同名の列を含むパラメーターがある場合でも大丈夫です。
update pod
Yuki Kimoto authored on 2011-02-07
801
二つの日付で比較しなければならない場合を
update pod
Yuki Kimoto authored on 2011-01-26
802
考えて見ましょう。
updated document
Yuki Kimoto authored on 2011-01-20
803

            
updated pod
Yuki Kimoto authored on 2011-06-07
804
    my $sql = "select * from table where date > :date and date < :date;";
updated document
Yuki Kimoto authored on 2011-01-20
805

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

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

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

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

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

            
817
titleの値だけで検索したい場合
818

            
updated pod
Yuki Kimoto authored on 2011-06-07
819
    where title = :title
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
820

            
821
authorの値だけで検索したい場合
822

            
updated pod
Yuki Kimoto authored on 2011-06-07
823
    where author = :author
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
824

            
825
titleとauthorの両方の値で検索したい場合
826

            
updated pod
Yuki Kimoto authored on 2011-06-07
827
    where title = :title and author = :author
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
828

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

            
832
    my $where = $dbi->where;
833

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

            
836
    $where->clause(
updated pod
Yuki Kimoto authored on 2011-06-07
837
        ['and', 'title = :title', 'author = :author']
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
838
    );
839

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

            
updated pod
Yuki Kimoto authored on 2011-06-07
842
    ['or' あるいは 'and', パラメーター1, パラメーター2, パラメーター3]
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
843

            
844
第一引数にはorあるいはandを指定します。第二引数以降には
updated pod
Yuki Kimoto authored on 2011-06-07
845
検索条件をパラメーターを使って記述します。
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
846

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

            
850
    ['and', 
updated pod
Yuki Kimoto authored on 2011-06-07
851
      'title = :title', 
852
      ['or', 'author = :author', 'date like :date']
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
853
    ]
854

            
updated pod
Yuki Kimoto authored on 2011-06-07
855
これは "title = :title and ( author = :author or date like :date )" 意味しています。
update pod
Yuki Kimoto authored on 2011-02-11
856

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

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

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

            
866
    my $where_clause = $where->to_string;
867

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

            
updated pod
Yuki Kimoto authored on 2011-06-07
870
    where title = :title
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
871

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

            
876
    my $where_clause = "$where";
877

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

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

            
updated pod
Yuki Kimoto authored on 2011-06-07
882
パラメーターの中に同一の名前を持つものが存在した場合でも動的に
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
883
where句を作成することができます。
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
884

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

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

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

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

            
updated pod
Yuki Kimoto authored on 2011-06-07
894
同名の列を含むパラメーターに順番に埋め込むことができます。
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
895

            
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
896
    $where->clause(
updated pod
Yuki Kimoto authored on 2011-06-07
897
        ['and', 'date > :date', 'date < :date']
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
898
    );
899
    $where->param($p);
900

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

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

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

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

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

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

            
914
    my $p = {date => []};
915

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

            
918
    my @date;
919
    push @date, exists $param->{start_date} ? $param->{start_date}
920
                                            : $dbi->not_exists;
921
    push @date, $param->{end_date} if exists $param->{end_date};
922
    my $p = {date => \@date};
923

            
924
=head3 C<select()>との連携
925

            
update pod
Yuki Kimoto authored on 2011-01-26
926
L<DBIx::Custom::Where>オブジェクトは
927
C<select()>のC<where>に直接渡すことが
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
928
できます。
929
    
930
    my $where = $dbi->where;
931
    $where->clause(...);
932
    $where->param($param);
933
    my $result = $dbi->select(table => 'book', where => $where);
934

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

            
937
=head3 C<execute()>との連携
938

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

            
941

            
942
    my $where = $dbi->where;
943
    $where->clause(...);
944
    $where->param($param);
945

            
update pod
Yuki Kimoto authored on 2011-02-11
946
    my $sql = <<"EOS";
make delete() using where ob...
Yuki Kimoto authored on 2011-01-26
947
    select * from book;
948
    $where
949
    EOS
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
950

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

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

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

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

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

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
963
    package MyModel;
964
    
965
    use base 'DBIx::Custom::Model';
update pod
Yuki Kimoto authored on 2011-01-28
966

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

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

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
971
    package MyModel::book;
972
    
973
    use base 'MyModel';
974
    
975
    sub insert { ... }
976
    sub list { ... }
update pod
Yuki Kimoto authored on 2011-01-28
977

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

            
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
980
    package MyModel::company;
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
981
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
982
    use base 'MyModel';
983
    
984
    sub insert { ... }
985
    sub list { ... }
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
986

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

            
989
    MyModel.pm
990
    MyModel / book.pm
991
            / company.pm
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
992

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

            
995
    $dbi->include_model('MyModel');
996

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

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

            
1001
    my $result = $dbi->model('book')->list;
1002

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

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

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

            
1015
    $dbi->model('book')->delete_at(where => 123);
1016

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

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

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

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

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

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

            
update pod
Yuki Kimoto authored on 2011-02-11
1029
    # DBIx::Custom method
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1030
    $model->execute($sql);
update pod
Yuki Kimoto authored on 2011-02-11
1031
    
1032
    # DBI method
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1033
    $model->begin_work;
1034
    $model->commit;
update pod
Yuki Kimoto authored on 2011-01-28
1035

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

            
1038
    my @models = keys %{$self->models};
1039

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

            
1042
   $model->primary_key(['id', 'number_id']);
1043

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

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

            
1049
    $model->filter({
1050
        title  => {out => ..., in => ..., end => ...},
1051
        author => {out => ..., in => ..., end => ...}
1052
    });
1053

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

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

            
1058
    $model->columns(['id', 'number_id']);
1059

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

            
1063
    $dbi->setup_model;
1064

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

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

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

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

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

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

            
1077
    クラス名     モデル名              テーブル名
1078
    book         (クラス名) -> book    (モデル名) -> book
1079

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

            
1082
    package MyModel::book;
1083
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1084
    use base 'MyModel';
1085
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1086
    __PACAKGE__->attr(name => 'book_model');
1087

            
1088
    クラス名     モデル名      テーブル名
1089
    book         book_model    (モデル名) -> book_model
1090

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

            
1093
    $dbi->model('book_model');
1094

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

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

            
1099
    use base 'MyModel';
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1100
    
1101
    __PACAKGE__->attr(table => 'book_table');
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1102
    
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-24
1103
    クラス名     モデル名              テーブル名
1104
    book         (クラス名) -> book    book_table
1105

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

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

            
cleanup
Yuki Kimoto authored on 2011-03-21
1110
=head2 列名の自動生成 : mycolumn(), column()
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-22
1111

            
cleanup
Yuki Kimoto authored on 2011-03-21
1112
列名の節を自動生成するにはC<mycolumn()>を使用します。
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-22
1113
C<table>とC<columns>の値が利用されます。
1114

            
cleanup
Yuki Kimoto authored on 2011-03-21
1115
    my $column_clause = $model->mycolumn;
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-22
1116

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

            
1120
    book.id as id, book.name as name
1121

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

            
cleanup
Yuki Kimoto authored on 2011-03-21
1124
また他のテーブルの列名から列名を自動生成することもできます。
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-22
1125

            
cleanup
Yuki Kimoto authored on 2011-03-21
1126
    my $column_clause = $model->column('company');
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-22
1127

            
cleanup
Yuki Kimoto authored on 2011-03-21
1128
モデルのC<comparny>のC<column>の値が['id', 'name']で
1129
あった場合は次のような列名の節が生成されます。
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-22
1130

            
cleanup
Yuki Kimoto authored on 2011-03-21
1131
    company.id as company__id, company.name as company__name
add experimental DBIx::Custo...
Yuki Kimoto authored on 2011-02-22
1132

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

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

            
1137
    package MyDBI;
1138
    
1139
    use base 'DBIx::Custom';
1140
    
1141
    sub connect {
1142
        my $self = shift->SUPER::connect(@_);
1143
        
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1144
        $self->include_model(
1145
            MyModel => [
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1146
                'book',
1147
                'company'
1148
            ]
update pod
Yuki Kimoto authored on 2011-01-28
1149
        );
1150
    }
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1151
    
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1152
    package MyModel::book;
1153
    use base 'DBIx::Custom::Model';
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1154
    
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
1155
    __PACKAGE__->attr('primary_key' => sub { ['id'] };
1156
    
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1157
    sub insert { ... }
1158
    sub list { ... }
1159
    
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
1160
    package MyModel::company;
1161
    use base 'DBIx::Custom::Model';
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
1162

            
1163
    __PACKAGE__->attr('primary_key' => sub { ['id'] };
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
1164
    
1165
    sub insert { ... }
1166
    sub list { ... }
update pod
Yuki Kimoto authored on 2011-01-28
1167

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

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

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

            
update pod
Yuki Kimoto authored on 2011-02-11
1175
    my $params = [
1176
        {title => 'Perl', author => 'Ken'},
1177
        {title => 'Good day', author => 'Tom'}
1178
    ]
1179
    my $query = $dbi->insert(table => 'book', param => $params->[0], query => 1);
update pod
Yuki Kimoto authored on 2011-01-26
1180

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

            
update pod
Yuki Kimoto authored on 2011-02-11
1184
    foreach my $param (@$params) {
1185
        $dbi->execute($query, $param);
1186
    }
1187

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

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

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

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

            
1204

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

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

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

            
update pod
Yuki Kimoto authored on 2011-01-26
1212
    $dbi->method(
updated document
Yuki Kimoto authored on 2011-01-20
1213
        update_or_insert => sub {
1214
            my $self = shift;
update pod
Yuki Kimoto authored on 2011-01-26
1215
            # something
updated document
Yuki Kimoto authored on 2011-01-20
1216
        },
1217
        find_or_create   => sub {
1218
            my $self = shift;
update pod
Yuki Kimoto authored on 2011-01-26
1219
            # something
updated document
Yuki Kimoto authored on 2011-01-20
1220
        }
1221
    );
1222

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

            
1226
    $dbi->update_or_insert;
1227
    $dbi->find_or_create;
1228

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

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

            
1234
    package MyResult;
1235
    use base 'DBIx::Custom::Result';
1236
    
1237
    sub some_method { ... }
updated document
Yuki Kimoto authored on 2011-01-20
1238

            
removed experimental expand
Yuki Kimoto authored on 2011-01-26
1239
    1;
1240
    
1241
    package main;
1242
    
1243
    use MyResult;
1244
    
1245
    my $dbi = DBIx::Custom->connect(...);
1246
    $dbi->result_class('MyResult');
updated document
Yuki Kimoto authored on 2011-01-20
1247

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

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

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

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