... | ... |
@@ -161,48 +161,60 @@ L<DBIx::Custom>はL<DBI>を補うとても便利なモジュールです。 |
161 | 161 |
|
162 | 162 |
=head2 1. データベースへの接続 |
163 | 163 |
|
164 |
+まずL<DBIx::Custom>を読み込みます。 |
|
165 |
+ |
|
166 |
+ use DBIx::Custom; |
|
167 |
+ |
|
164 | 168 |
L<DBIx::Custom>オブジェクトを生成し、データベースに接続するには |
165 | 169 |
C<connect()>メソッドを使用します。 |
166 | 170 |
|
167 |
- use DBIx::Custom; |
|
168 |
- my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=dbname", |
|
169 |
- user => 'ken', password => '!LFKD%$&'); |
|
171 |
+ my $dbi = DBIx::Custom->connect( |
|
172 |
+ data_source => "dbi:mysql:database=dbname", |
|
173 |
+ user => 'ken', |
|
174 |
+ password => '!LFKD%$&', |
|
175 |
+ dbi_options => {mysql_enable_utf8 => 1} |
|
176 |
+ ); |
|
170 | 177 |
|
171 |
-B<Data sourceのサンプル:> |
|
178 |
+C<data_source>はデータベースシステムに応じたフォーマットで |
|
179 |
+指定する必要があります。以下にデータベースごとのフォーマット |
|
180 |
+方法のサンプルを掲載しておきます。 |
|
172 | 181 |
|
173 |
-MySQL |
|
182 |
+B<MySQL> |
|
174 | 183 |
|
175 | 184 |
"dbi:mysql:database=$database" |
176 | 185 |
"dbi:mysql:database=$database;host=$hostname;port=$port" |
177 | 186 |
|
178 |
-SQLite |
|
187 |
+B<SQLite> |
|
179 | 188 |
|
180 | 189 |
"dbi:SQLite:dbname=$database" |
181 | 190 |
"dbi:SQLite:dbname=:memory:" |
182 | 191 |
|
183 |
-PostgreSQL |
|
192 |
+B<PostgreSQL> |
|
184 | 193 |
|
185 | 194 |
"dbi:Pg:dbname=$dbname" |
186 | 195 |
|
187 |
-Oracle |
|
196 |
+B<Oracle> |
|
188 | 197 |
|
189 | 198 |
"dbi:Oracle:$dbname" |
190 | 199 |
"dbi:Oracle:host=$host;sid=$sid" |
191 | 200 |
|
192 |
-ODBC(Microsoft Access) |
|
201 |
+B<ODBC(Microsoft Access)> |
|
193 | 202 |
|
194 | 203 |
"dbi:ODBC:driver=Microsoft Access Driver (*.mdb);dbq=hoge.mdb" |
195 | 204 |
|
196 |
-ODBC(SQL Server) |
|
205 |
+B<ODBC(SQL Server)> |
|
197 | 206 |
|
198 | 207 |
"dbi:ODBC:driver={SQL Server};Server=(local);database=test;Trusted_Connection=yes;AutoTranslate=No;" |
199 | 208 |
|
209 |
+また認証が求められる場合は、C<user>とC<password>ユーザ名と |
|
210 |
+パスワードを指定する必要があります。 |
|
211 |
+ |
|
200 | 212 |
L<DBIx::Custom>はL<DBI>のラッパです。 |
201 |
-L<DBI>オブジェクトはC<dbh>で取得することができます。 |
|
213 |
+L<DBI>のデータベースハンドルはC<dbh>で取得することができます。 |
|
202 | 214 |
|
203 | 215 |
my $dbh = $dbi->dbh; |
204 | 216 |
|
205 |
-データベースハンドル属性にはデフォルトで次のものが設定されます。 |
|
217 |
+L<DBIx::Custom>ではデータベースハンドル属性にはデフォルトで次のものが設定されます。 |
|
206 | 218 |
|
207 | 219 |
$dbi->dbh->{RaiseError} = 1; |
208 | 220 |
$dbi->dbh->{PrintError} = 0; |
... | ... |
@@ -212,206 +224,199 @@ L<DBI>オブジェクトはC<dbh>で取得することができます。 |
212 | 224 |
例外が発生しプログラムは終了します。 |
213 | 225 |
またクエリが発行されると自動的にコミットされます。 |
214 | 226 |
|
215 |
-=head2 2. シュガーメソッド |
|
227 |
+=head2 2. 挿入、更新、削除、選択のためのメソッド |
|
216 | 228 |
|
217 | 229 |
L<DBIx::Custom>は、 |
218 | 230 |
C<insert()>、C<update()>、C<delete()>、C<select()> |
219 |
-のようなシュガーメソッドを持っています。 |
|
220 |
-小さなことを行うのであれば、SQL文を |
|
221 |
-作成する必要はありません。 |
|
231 |
+のような挿入、更新、削除、選択を行うためのメソッドを持っています。 |
|
232 |
+簡単なことをを行うのであれば、SQLを自分で記述する必要がありません。 |
|
222 | 233 |
|
223 | 234 |
=head3 C<insert()> |
224 | 235 |
|
225 |
-C<insert>メソッドです。データベースにデータを挿入します。 |
|
236 |
+データベースにデータを挿入するにはC<insert()>を使用します。 |
|
226 | 237 |
|
227 | 238 |
$dbi->insert(table => 'book', |
228 | 239 |
param => {title => 'Perl', author => 'Ken'}); |
229 | 240 |
|
230 |
-これは次のL<DBI>の操作と同じです。 |
|
241 |
+C<table>にはテーブル名、C<param>には挿入したいデータを指定します。 |
|
231 | 242 |
|
232 |
- my $sth = $dbh->prepare('insert into (title, author) values (?, ?);'); |
|
233 |
- $sth->execute('Perl', 'Ken'); |
|
243 |
+次のSQLが発行されます。 |
|
244 |
+ |
|
245 |
+ insert into (title, author) values (?, ?); |
|
234 | 246 |
|
235 | 247 |
=head3 C<update()> |
236 | 248 |
|
237 |
-C<update>メソッドです。データベースのデータを更新します。 |
|
249 |
+データベースのデータを更新するには、C<update()>を使用します。 |
|
238 | 250 |
|
239 | 251 |
$dbi->update(table => 'book', |
240 | 252 |
param => {title => 'Perl', author => 'Ken'}, |
241 | 253 |
where => {id => 5}); |
242 | 254 |
|
243 |
-これは次のL<DBI>の操作と同じです。 |
|
255 |
+C<table>にはテーブル名、C<param>には挿入したいデータ、C<where>には |
|
256 |
+条件を指定します。 |
|
244 | 257 |
|
245 |
- my $sth = $dbh->prepare( |
|
246 |
- 'update book set title = ?, author = ? where id = ?;'); |
|
247 |
- $sth->execute('Perl', 'Ken', 5); |
|
258 |
+次のSQLが発行されます。 |
|
259 |
+ |
|
260 |
+ update book set title = ?, author = ?; |
|
248 | 261 |
|
249 | 262 |
C<update>メソッドは安全のため |
250 | 263 |
where句のないSQLを発行することを許可していません。 |
251 | 264 |
もしすべての行を更新したい場合は |
252 |
-C<update_all()>メソッドを使用してください。 |
|
265 |
+C<update_all()>を使用してください。 |
|
253 | 266 |
|
254 | 267 |
$dbi->update_all(table => 'book', |
255 | 268 |
param => {title => 'Perl', author => 'Ken'}); |
256 | 269 |
|
257 | 270 |
=head3 C<delete()> |
258 | 271 |
|
259 |
-C<delete>メソッドです。データベースのデータを削除します。 |
|
272 |
+データベースのデータを1件削除するには、C<delete()>を使用します。 |
|
260 | 273 |
|
261 | 274 |
$dbi->delete(table => 'book', |
262 | 275 |
where => {author => 'Ken'}); |
263 | 276 |
|
264 |
-これは次のL<DBI>の操作と同じです。 |
|
277 |
+C<table>にはテーブル名、C<where>には条件を指定します。 |
|
265 | 278 |
|
266 |
- my $sth = $dbh->prepare('delete from book where id = ?;'); |
|
267 |
- $sth->execute('Ken'); |
|
279 |
+次のSQLが発行されます。 |
|
280 |
+ |
|
281 |
+ delete from book where id = ?; |
|
268 | 282 |
|
269 | 283 |
C<delete>メソッドは安全のため |
270 | 284 |
where句のないSQLを発行することを許可していません。 |
271 | 285 |
もしすべての行を削除したい場合は |
272 |
-C<delete_all()>メソッドを使用してください。 |
|
286 |
+C<delete_all()>を使用してください。 |
|
273 | 287 |
|
274 | 288 |
$dbi->delete_all(table => 'book'); |
275 | 289 |
|
276 | 290 |
=head3 C<select()> |
277 | 291 |
|
278 |
-C<select>メソッドです。テーブル名だけを指定しています。 |
|
292 |
+行を選択するにはC<select()>を使用します。 |
|
279 | 293 |
|
280 | 294 |
my $result = $dbi->select(table => 'book'); |
281 | 295 |
|
282 |
-これは次のL<DBI>の操作と同じです。 |
|
296 |
+C<table>だけを指定して、他の条件を指定しない場合は次のSQLが発行されます。 |
|
283 | 297 |
|
284 |
- my $sth = $dbh->prepare('select * from book;); |
|
285 |
- $sth->execute; |
|
298 |
+ select * from book; |
|
286 | 299 |
|
287 | 300 |
C<select()>メソッドの戻り値はL<DBIx::Custom::Result> |
288 |
-オブジェクトです。C<fetch>メソッドを使用して |
|
289 |
-行をフェッチすることができます。 |
|
301 |
+オブジェクトです。行をフェッチするにはC<fetch()>を使用します。 |
|
290 | 302 |
|
291 | 303 |
while (my $row = $result->fetch) { |
292 | 304 |
my $title = $row->[0]; |
293 | 305 |
my $author = $row->[1]; |
294 | 306 |
} |
295 | 307 |
|
308 |
+L<DBIx::Custom::Result>についてはこの後L<3. 行のフェッチ/"3. 行のフェッチ">で詳しく扱います。 |
|
309 |
+ |
|
310 |
+さまざまなC<select()>の使い方を見ていきましょう。 |
|
296 | 311 |
次のC<select>は行の名前とwhere句を指定したものです。 |
297 | 312 |
|
298 | 313 |
my $result = $dbi->select( |
299 | 314 |
table => 'book', |
300 |
- column => [qw/author title/], |
|
315 |
+ column => ['author', 'title'], |
|
301 | 316 |
where => {author => 'Ken'} |
302 | 317 |
); |
303 | 318 |
|
304 |
-次のL<DBI>の操作と同じです。 |
|
305 |
- |
|
306 |
- my $sth = $dbh->prepare( |
|
307 |
- 'select author, title from book where author = ?;'); |
|
308 |
- $sht->execute('Ken'); |
|
319 |
+C<column>には列名を、C<where>には条件を指定することができます。 |
|
320 |
+次のSQLが発行されます。 |
|
321 |
+ |
|
322 |
+ select author, title from book where author = ?; |
|
309 | 323 |
|
310 |
-テーブルをjoinしたい場合はC<relation>を使用します。 |
|
324 |
+テーブルを結合したい場合ははC<relation>にテーブルの |
|
325 |
+関係を記述します。 |
|
311 | 326 |
|
312 | 327 |
my $result = $dbi->select( |
313 | 328 |
table => ['book', 'rental'], |
314 |
- column => ['book.name as book_name'] |
|
329 |
+ where => {book.name => 'Perl'}, |
|
315 | 330 |
relation => {'book.id' => 'rental.book_id'} |
316 | 331 |
); |
317 | 332 |
|
318 |
-次のL<DBI>の操作と同じです。 |
|
333 |
+bookテーブルのid列とrentalテーブルのbook_idが関連付けられます。 |
|
334 |
+次のSQLが発行されます。 |
|
319 | 335 |
|
320 |
- my $sth = $dbh->prepare( |
|
321 |
- 'select book.name as book_name from book, rental' . |
|
322 |
- 'where book.id = rental.book_id;'); |
|
323 |
- $sth->execute; |
|
336 |
+ select * from book, rental where book.name = ? and book.id = rental.book_id; |
|
324 | 337 |
|
325 |
-SQL文の末尾に文字列を追加したい場合は<append>オプションを使用します。 |
|
338 |
+SQL文の末尾に文字列を追加したい場合は<append>を使用します。 |
|
326 | 339 |
|
327 | 340 |
my $result = $dbi->select( |
328 | 341 |
table => 'book', |
329 | 342 |
where => {author => 'Ken'}, |
330 |
- append => 'order by price limit 5', |
|
343 |
+ append => 'for update', |
|
331 | 344 |
); |
332 | 345 |
|
333 |
-次のL<DBI>の操作と同じです。 |
|
346 |
+次のSQLが発行されます。 |
|
334 | 347 |
|
335 |
- my $sth = $dbh->prepare( |
|
336 |
- 'select * book where author = ? order by price limit 5;'); |
|
337 |
- $sth->execute; |
|
348 |
+ select * book where author = ? for update; |
|
338 | 349 |
|
339 |
-C<append>オプションは、C<insert()>、C<update()>、C<update_all()> |
|
340 |
-C<delete()>、C<select>メソッドで使用することが |
|
341 |
-できます。 |
|
342 |
- |
|
343 |
-この後のフィルタリングの解説で詳しく扱いますが、値をフィルタリングしたい |
|
344 |
-場合はC<filter>オプションを使用することができます。 |
|
345 |
- |
|
346 |
- $dbi->insert(table => 'book', |
|
347 |
- param => {title => 'Perl', author => 'Ken'}); |
|
348 |
- filter => {title => 'encode_utf8', |
|
349 |
- author => 'encode_utf8'}); |
|
350 |
- |
|
351 |
-C<filter>オプションは、C<insert()>、C<update()>、C<update_all()> |
|
352 |
-C<delete()>、C<select>メソッドで使用することが |
|
353 |
-できます。 |
|
354 |
- |
|
355 |
-C<select()>メソッドのC<where>オプションではハッシュの代わりに |
|
356 |
-タグを利用することもできます。これによって柔軟な |
|
357 |
-条件を指定することができます。 |
|
358 |
- |
|
359 |
- # Select, more flexible where |
|
360 |
- my $result = $dbi->select( |
|
361 |
- table => 'book', |
|
362 |
- where => ['{= author} and {like title}', |
|
363 |
- {author => 'Ken', title => '%Perl%'}] |
|
364 |
- ); |
|
365 |
- |
|
366 |
-タグについては以降で解説します。 |
|
350 |
+またC<append>は、C<select>だけでなくC<insert()>、C<update()>、C<update_all()> |
|
351 |
+C<delete()>、C<delete_all()>、C<select()>で使用することもできます。 |
|
367 | 352 |
|
368 | 353 |
=head2 3. 行のフェッチ |
369 | 354 |
|
370 |
-C<select()>メソッドの戻り値であるL<DBIx::Custom::Result> |
|
371 |
-には行をフェッチするためのさまざまなメソッドが |
|
355 |
+C<select()>メソッドの戻り値はL<DBIx::Custom::Result>オブジェクトです。 |
|
356 |
+L<DBIx::Custom::Result>には行をフェッチするためのさまざまなメソッドが |
|
372 | 357 |
用意されています。 |
373 |
-(このセクションの解説では「配列」は「配列のリファレンス」を |
|
374 |
-「ハッシュ」は「ハッシュのリファレンス」を意味しますので |
|
375 |
-注意してください。) |
|
376 | 358 |
|
377 | 359 |
=head3 C<fetch> |
378 | 360 |
|
379 |
-一行フェッチして配列に格納します。 |
|
361 |
+一行フェッチして配列のリファレンスに格納するにはC<fetch()>を使用します。 |
|
380 | 362 |
|
381 | 363 |
while (my $row = $result->fetch) { |
382 |
- my $author = $row->[0]; |
|
383 |
- my $title = $row->[1]; |
|
364 |
+ my $title = $row->[0]; |
|
365 |
+ my $author = $row->[1]; |
|
384 | 366 |
} |
385 | 367 |
|
368 |
+whileループを使って、すべての行を取得することができます。 |
|
369 |
+ |
|
386 | 370 |
=head3 C<fetch_first> |
387 | 371 |
|
388 |
-一行だけフェッチして配列に格納します。 |
|
372 |
+一行だけフェッチして配列のリファレンスに格納するにはC<fetch_first()> |
|
373 |
+を使用します。 |
|
389 | 374 |
|
390 | 375 |
my $row = $result->fetch_first; |
391 | 376 |
|
392 |
-フェッチが終わった後は、ステートメントハンドルからC<finish()> |
|
393 |
-メソッドが呼び出されてそれ以上フェッチできなくなります。 |
|
377 |
+一行のフェッチが終わった後はそれ以上フェッチできなくなります。 |
|
378 |
+内部的には1行のフェッチが終わった後に |
|
379 |
+ステートメントハンドルのC<finish()>が実行されます。 |
|
394 | 380 |
|
395 | 381 |
=head3 C<fetch_multi> |
396 | 382 |
|
397 |
-複数行をフェッチして配列の配列に格納します。 |
|
383 |
+複数行をフェッチして配列のリファレンスを要素に持つ |
|
384 |
+配列のリファレンスに格納するにはC<fetch_multi()>を使用します。 |
|
398 | 385 |
|
399 |
- while (my $rows = $result->fetch_multi(5)) { |
|
400 |
- my $first_author = $rows->[0][0]; |
|
401 |
- my $first_title = $rows->[0][1]; |
|
402 |
- my $second_author = $rows->[1][0]; |
|
403 |
- my $second_value = $rows->[1][1]; |
|
386 |
+ while (my $rows = $result->fetch_multi(2)) { |
|
387 |
+ my $title0 = $rows->[0][0]; |
|
388 |
+ my $author0 = $rows->[0][1]; |
|
389 |
+ |
|
390 |
+ my $title1 = $rows->[1][0]; |
|
391 |
+ my $author1 = $rows->[1][1]; |
|
404 | 392 |
} |
405 | 393 |
|
394 |
+引数には取り出したい行数を指定します。 |
|
395 |
+ |
|
396 |
+指定した行を格納した次のようなデータを取得できます。 |
|
397 |
+ |
|
398 |
+ [ |
|
399 |
+ ['Perl', 'Ken'], |
|
400 |
+ ['Ruby', 'Mark'] |
|
401 |
+ ] |
|
402 |
+ |
|
406 | 403 |
=head3 C<fetch_all> |
407 | 404 |
|
408 |
-すべての行をフェッチして配列の配列に格納します。 |
|
405 |
+すべての行をフェッチして配列のリファレンスを要素に持つ |
|
406 |
+配列のリファレンスに格納するにはC<fetch_all()>を使用します。 |
|
409 | 407 |
|
410 | 408 |
my $rows = $result->fetch_all; |
411 | 409 |
|
410 |
+すべての行を格納した次のようなデータを取得できます。 |
|
411 |
+ |
|
412 |
+ [ |
|
413 |
+ ['Perl', 'Ken'], |
|
414 |
+ ['Ruby', 'Mark'] |
|
415 |
+ ] |
|
416 |
+ |
|
412 | 417 |
=head3 C<fetch_hash> |
413 | 418 |
|
414 |
-一行フェッチしてハッシュに格納します。 |
|
419 |
+一行フェッチしてハッシュのリファレンスに格納するにはC<fetch_hash()>を使用します。 |
|
415 | 420 |
|
416 | 421 |
while (my $row = $result->fetch_hash) { |
417 | 422 |
my $title = $row->{title}; |
... | ... |
@@ -420,36 +425,64 @@ C<select()>メソッドの戻り値であるL<DBIx::Custom::Result> |
420 | 425 |
|
421 | 426 |
=head3 C<fetch_hash_first> |
422 | 427 |
|
423 |
-一行だけフェッチしてハッシュに格納します。 |
|
428 |
+一行だけフェッチしてハッシュのリファレンスに格納するには |
|
429 |
+C<fetch_hash_first()>を使用します。 |
|
424 | 430 |
|
425 | 431 |
my $row = $result->fetch_hash_first; |
426 | 432 |
|
427 |
-フェッチが終わった後は、ステートメントハンドルからC<finish()> |
|
428 |
-メソッドが呼び出されてそれ以上フェッチできなくなります。 |
|
433 |
+一行のフェッチが終わった後はそれ以上フェッチできなくなります。 |
|
434 |
+内部的には1行のフェッチが終わった後に |
|
435 |
+ステートメントハンドルのC<finish()>が実行されます。 |
|
429 | 436 |
|
430 | 437 |
=head3 C<fetch_hash_multi> |
431 | 438 |
|
432 |
-複数行をフェッチしてハッシュの配列に格納します。 |
|
439 |
+複数行をフェッチしてハッシュのリファレンスを要素に持つ |
|
440 |
+配列のリファレンスに格納するにはC<fetch_hash_multi()> |
|
441 |
+を使用します。 |
|
433 | 442 |
|
434 | 443 |
while (my $rows = $result->fetch_hash_multi(5)) { |
435 |
- my $first_title = $rows->[0]{title}; |
|
436 |
- my $first_author = $rows->[0]{author}; |
|
437 |
- my $second_title = $rows->[1]{title}; |
|
438 |
- my $second_author = $rows->[1]{author}; |
|
444 |
+ my $title0 = $rows->[0]{title}; |
|
445 |
+ my $author0 = $rows->[0]{author}; |
|
446 |
+ my $title1 = $rows->[1]{title}; |
|
447 |
+ my $author1 = $rows->[1]{author}; |
|
439 | 448 |
} |
440 | 449 |
|
450 |
+引数には取り出したい行数を指定します。 |
|
451 |
+ |
|
452 |
+指定した行を格納した次のようなデータを取得できます。 |
|
453 |
+ |
|
454 |
+ [ |
|
455 |
+ {title => 'Perl', author => 'Ken'}, |
|
456 |
+ {title => 'Ruby', author => 'Mark'} |
|
457 |
+ ] |
|
458 |
+ |
|
441 | 459 |
=head3 C<fetch_all> |
442 | 460 |
|
443 |
-すべての行をフェッチしてハッシュの配列に格納します。 |
|
461 |
+すべての行をフェッチしてハッシュのリファレンスを要素に持つ |
|
462 |
+配列のリファレンスに格納するにはC<fetch_hash_all()> |
|
463 |
+を使用します。 |
|
444 | 464 |
|
445 | 465 |
my $rows = $result->fetch_hash_all; |
446 | 466 |
|
447 |
-L<DBI>のステートメントハンドルに直接アクセスしたい場合は |
|
448 |
-<sth>を使用します。 |
|
467 |
+すべての行を格納した次のようなデータを取得できます。 |
|
468 |
+ |
|
469 |
+ [ |
|
470 |
+ {title => 'Perl', author => 'Ken'}, |
|
471 |
+ {title => 'Ruby', author => 'Mark'} |
|
472 |
+ ] |
|
473 |
+ |
|
474 |
+=head3 sth |
|
475 |
+ |
|
476 |
+ステートメントハンドルに直接アクセスしたい場合は |
|
477 |
+<sth>で取得することができます。 |
|
449 | 478 |
|
450 | 479 |
my $sth = $result->sth; |
451 | 480 |
|
452 |
-=head2 4. ハッシュパラメタバインド |
|
481 |
+フェッチのパフォーマンスが用件を満たさないときには、 |
|
482 |
+ステートメントハンドルから |
|
483 |
+利用できる速度の速いメソッドを利用することができます。 |
|
484 |
+ |
|
485 |
+=head2 4. タグ |
|
453 | 486 |
|
454 | 487 |
L<DBIx::Custom>はハッシュパラメタバインドを提供します。 |
455 | 488 |
|