データベースハンドルは接続したデータベースごとに使うことになるハンドラです。データベースハンドルは、よく使われるメソッドが揃っていますので、すべてが重要といっても過言ではありません。
データベースハンドルメソッド
do
$rc = $dbh->do($statement) || die $dbh->errstr; $rc = $dbh->do($statement, \%attr) || die $dbh->errstr;
$rv = $dbh->do($statement, \%attr, @bind_values) || ...
SQL
文をprepare
、execute
し、処理された行数を返します。利用不可などの場合は-1、もしくはundef
を返します。
do
の使用方法
my $rows = $dbh->do(q{ DELETE FROM table }, undef, 'DONE') || die $dbh->errstr;
このメソッドは、prepare
しても無効、もしくは繰り返し実行しないSQL
文で効果的です。 ステートメント・ハンドルを返さないので、SELECT
文では役に立ちません。
do
メソッドは、以下の処理と同じことです。
sub do { my($dbh, $statement, $attr, @bind_values) = @_; my $sth = $dbh->prepare($statement, $attr) or return undef; $sth->execute(@bind_values) or return undef; my $rows = $sth->rows; ($rows == 0) ? "0E0" : $rows; # always return true if no error }
プレースホルダと@bind_values
をdo
メソッドで使うと、$statement
の中の変数をクォートする必要がありません。ただし、ステートメントを何度も実行するような場合は、一度だけprepare
してからexecute
を繰り返す方が効果的です。
selectrow_array
@row_ary = $dbh->selectrow_array($statement); @row_ary = $dbh->selectrow_array($statement, \%attr); @row_ary = $dbh->selectrow_array($statement, \%attr, @bind_values);
このメソッドは、prepare
、execute
、fetchrow_array
をまとめて実行します。リストコンテキストでは最初の行、スカラコンテキストでは最初の行の最初のフィールドを返します。
$statement
パラメータは既にprepare
済みのステートメント・ハンドルにすることでき、その場合はprepare
をスキップします。
いずれかのメソッドでエラーが発生した場合、RaiseError
が設定されていなければ空のリスト(スカラではundef
)を返します。
selectall_arrayref
$ary_ref = $dbh->selectall_arrayref($statement); $ary_ref = $dbh->selectall_arrayref($statement, \%attr); $ary_ref = $dbh->selectall_arrayref($statement, \%attr, @bind_values);
このメソッドはprepare
、execute
、fetchall_arrayref
をまとめて実行します。
$statement
パラメータは既にprepare
済みのステートメント・ハンドルにすることでき、その場合はprepare
をスキップします。
いずれかのメソッドでエラーが発生した場合、RaiseError
が設定されていなければ空のリスト(スカラではundef
)を返します。
selectall_hashref
$ary_ref = $dbh->selectall_hashref($statement); $ary_ref = $dbh->selectall_hashref($statement, \%attr); $ary_ref = $dbh->selectall_hashref($statement, \%attr, @bind_values);
このメソッドは、prepare
、execute
、fetchrow_hashref
をまとめて実行します。返却値は、フィールド名と値のペアを持ったハッシュへのリファレンスです。
$statement
パラメータは既にprepare
済みのステートメント・ハンドルにすることでき、その場合はprepare
をスキップします。何回もステートメントを実行するような場合に効果的です。
fetch
以外のメソッドでエラーが発生した場合、RaiseError
が設定されていなければundef
を返します。fetch
が失敗し、RaiseError
が設定されていなければ、それまでに取り出したデータを可能な限り返します。このような場合に備えて$DBI::err
をチェックしたほうが良いでしょう。
selectcol_arrayref
$ary_ref = $dbh->selectcol_arrayref($statement); $ary_ref = $dbh->selectcol_arrayref($statement, \%attr); $ary_ref = $dbh->selectcol_arrayref($statement, \%attr, @bind_values);
このメソッドは、prepare
、execute
をまとめて実行し、各行からの最初のカラムの値が入った配列へのリファレンスを返します。
$statement
パラメータは既にprepare
済みのステートメント・ハンドルにすることでき、その場合はprepare
をスキップします。何回もステートメントを実行するような場合に効果的です。
fetch
以外のメソッドでエラーが発生した場合、RaiseError
が設定されていなければundef
を返します。fetch
が失敗し、RaiseError
が設定されていなければ、それまでに取り出したデータを可能な限り返します。このような場合に備えて$DBI::err
をチェックしたほうが良いでしょう。
prepare
$sth = $dbh->prepare($statement) || die $dbh->errstr; $sth = $dbh->prepare($statement, \%attr) || die $dbh->errstr;
SQL
文を実行できるように準備し、ステートメント・ハンドルへのリファレンスを返します。返却値のステートメント・ハンドルはステートメントの属性を取得したり、execute
メソッドを起動するために使用できます。prepare
を使うとexecute
の実行速度が向上します(ただし、MySQL
では単に文を保存するだけです)。
このメソッドはプレースホルダが使えます。
プレースホルダの使用例
my $sth = $dbh->@prepare("SELECT * FROM mytable WHERE name LIKE ?"); $sth->bind_param(1, 'J%');
ステートメントを準備する概念を持っていないエンジンのドライバは、$sth->
execute
が呼ばれるまでは、$sth->{NUM_OF_FIELDS}
などは返せません。
通常、SQL
では文の終わりにセミコロンなどを使いますが、DBI
では必要ありません。
prepare_cached
$sth = $dbh->prepare_cached($statement) || die $dbh->errstr; $sth = $dbh->prepare_cached($statement, \%attr) || die $dbh->errstr;
キャッシングを行う点を除いてprepare
と同じです。同じパラーメータ値でprepare_cached
を呼び出すと、データベースに接続しないで、キャッシュにある$sth
を返します。
このキャッシングは有効ではありますが、問題の原因になりやすいので注意しましょう。現在、キャッシュされている$sth
がActive
だと警告されます。
CachedKids
属性でキャッシュにアクセスすることができます。
commit MySQL非サポート
$rc = $dbh->commit || die $dbh->errstr;
データベースがトランザクションをサポートする場合、データベース変更の中で最も最新の変更をコミットします。
データベースがトランザクションをサポートし、AutoCommit
がオンの場合、commit
はcommit ineffective with AutoCommit
警告を出します。
rollback MySQL非サポート
$rc = $dbh->rollback || die $dbh->errstr;
データベースがトランザクションをサポートする場合、コミットされていない最も最新の変更をロールバック(取消)します。
データベースがトランザクションをサポートし、AutoCommit
がオンの場合、rollback
はrollback ineffective with AutoCommit
警告を出します。
disconnect MySQLでは必要なし
$rc = $dbh->disconnect or warn $dbh->errstr;
データベース・ハンドルをデータベースから切断します。disconnect
はプログラムを終了するときにだけ使います。
トランザクションを備えたDBMSは、disconnect
実行によって変更を自動的にコミットするものや、変更をロールバックするものなどがあり、統一されていません。AutoCommit
を使わないアプリケーションは、disconnect
を呼び出す前に、commit
またはrollback
をするべきです。
まだ接続していて、ハンドルへの参照がなくなった場合、DESTROY
メソッドによりデータベースは自動的に切断されます。各ドライバへのDESTROY
メソッドはコミットされていない変更を元に戻すため、暗黙のうちにrollback
を呼び出します。
Active
なステートメント・ハンドルがあるのに、disconnect
を使うと警告を受けます。ステートメント・ハンドルは切断の前に破棄するか、そlれぞれにfinish
メソッドを呼び出すべきです。
ping
$rc = $dbh->ping;
合理的で効率的な方法で、データベースサーバーが稼動しているか、接続が正常かを調査します。アプリケーションでこのメソッドを使うことはあまりないでしょう。
現在のデフォルトの実装は、実際には何もせず常に"真"を返します。実際には、それは0 but true
を返します、これは"真"ですがゼロです。これにより返された値が本物なのか単なるデフォルトなのかがわかります。。ドライバはこのメソッドをデータベースのタイプにあったものでこのメソッドを上書きしなければなりません。
使用例としては専門的なApache::DBI
モジュールをご覧ください。
table_info primary_key_info primary_key tables type_info_all type_info
実験的に使われているメソッドです。
quote
$sql = $dbh->quote($value); $sql = $dbh->quote($value, $data_type);
このメソッドは、文字列リテラルをSQL
文で使えるように特殊文字をエスケープし、文字列全体をクォートで囲みます。未定義の$value
値はNULL
として返されます。
$sql = sprintf "select foo from bar where baz = %s", $dbh->quote("Don't\n");
quote
は、バイナリデータ、それにシェルのエスケープやメタ文字には対応していません。 また、プレースホルダとバインド値で使われる値についてはquote
する必要ありません。
データベースハンドル属性
データベース・ハンドル属性を変更しても、既にあるほかのハンドルの属性には影響を与えません。
ドライバに依存する属性を除いては、決められていない属性を設定、あるいは取得しようとするとエラーが発生します。
$h->{AutoCommit} = ...; # 設定 ... = $h->{AutoCommit}; # 読み込み
AutoCommit(ブール) MySQL非サポート
値が"真"であれば、データベースの変更を元に戻すことはできません。"偽"であれば、データベースの変更は自動的にトランザクションのなかに入り、commit
またはrollback
メソッドを使ってコミットあるいはロールバックされなければなりません。
AutoCommit
をサポートされていない値に設定しようとすると、致命的なエラーになります。完全なトランザクションを必要とするアプリケーションは、代入される値が
正しいかどうかをチェックすることなしに、 $dbh->{AutoCommit}=0
(またはconnect
メソッド
でAutoCommit
を 0 に設定)とすることができます。
トランザクションを全くサポートしないデータベース
これらのデータベースで、AutoCommit
をオフにしようとすると致命的なエラーになります。commit
、rollback
は、AutoCommit
が有効な間は、無効であると警告します。
トランザクションが常に活発なデータベース
AutoCommit
がオフの場合、データベースへの変更はcommit
されるまで有効になりません。rollback
が呼ばれれば、最後のcommit
以降の変更はすべて元に戻されます。
AutoCommit
がオンであるば、DBI
はまるで、正常終了したデータベース操作の後、自動的にcommit
を
呼んでいるのと同じように振る舞います。
AutoCommit
をオフからオンに返ると、大抵のドライバはcommit
します。
トランザクションが明示的に始められなければならないデータベース
これらのデータベースでは、トランザクションが常に有効なデータベースと同じような動作をします。
DBI
ドライバは、AutoCommit
がオフになると、自動的にトランザクションを開始します。そしてcommit
やrollback
.の後、自動的に新しいトランザクションを開始します。
Driver (handle)
ハンドルの親ドライバを保持します。
print $dbh->{Driver}->{Name}, "\n";
Name(文字列)
データベースの名前を保持します。
Statement (文字列, 読み取り専用)
prepare
に渡されたステートメント文字列を返します。Statement
が有効なケースとしては、RaiseError
が有効になっていて、例外ハンドラが$@
をチェックし、prepare
メソッドが失敗したかもしれないと思われるときです。
RowCacheSize(整数)
RowCashSize
の値は、SELECT
文に使うローカルな行キャッシュの大きさを示します。行キャッシュが実装されていなければ、RowCashSize
の設定は無視され、undef
が返されます。
RowCacheSize
の値
レベル | 解説 |
---|---|
0以下 | 各 SELECT のためにメモリの量に合わせて行をキャッシュします |
0 | 自動的に各 SELECT に適切なキャッシュサイズを決めます |
1 | ローカル行キャッシュを使用しません |
1以上 | この数だけ行をキャッシュします |
キャッシュされる行の数×行の最大サイズだけのメモリが必要になるので、必要なだけの値を設定するべきです。また、キャッシュの大きさだけ最初の取得、もしくは次のキャッシュ分を取得するさいに時間がかかるようになります。
RowsInCache
も参照してください。