PerlのDBIモジュールで始めるPostgreSQLデータベース操作入門
作成日:2007.08.11
PerlでPostgreSQLデータベース操作を行うための「DBIモジュール」の基本的な使い方を解説します。接続方法やデータの追加・更新・削除・検索の操作に加え、効率的なSQL文の実行方法まで。
error この記事は最終更新日から17年以上が経過しています。
DBIモジュールを使用する
perlにはデータベースを操作するためのモジュール「DBI」が用意されている。
Windows用のActivePerlを使う場合は、2003年3月現在は別途DBIモジュールをインストールしないといけない。
詳しいやり方は忘れた。DOS窓からppmコマンドで色々やったらインストールできたはず。
とりあえず、
#-- DBIモジュールの使用を宣言
use DBI;
データベースに接続
DBIモジュールを使ってPostgreSQLデータベースに接続するには、connect ステートメントを使用する。
「Amethyst」という名前のデータベースに、アカウント名「amethyst」パスワード「abcdefg」で接続する場合、下記のようにする。
#-- データベースに接続
$DB = DBI->connect("DBI:Pg:dbname=Amethyst","amethyst","abcdefg");
一つのプログラムで何度もデータベースに対してSQL文を発行する場合は、 その都度connectしたりせずにプログラムの最初に connect して、全ての処理が終わったら disconnect した方が良いらしい。
データの編集
データベース内のデータの編集関連のSQL文(insert,update,delete)の使用例。
#-- insert文の使用例
#-- SQL文を変数 $SQLstatに格納
$SQLstat = $DB->prepare("insert into $table_name (ID,Name) values ($id,$name)");
#-- SQL文を実行
$RESULT = $SQLstat->execute;
#-- 実行したSQL文を破棄
$SQLstat->finish;
#-- update文の使用例
#-- SQL文を変数 $SQLstatに格納
$SQLstat = $DB->prepare("update $table_name set Name='$name' where ID = '$id'");
#-- SQL文を実行
$RESULT = $SQLstat->execute;
#-- 実行したSQL文を破棄
$SQLstat->finish;
#-- delete文の使用例
#-- SQL文を変数 $SQLstatに格納
$SQLstat = $DB->prepare("delete from $table_name where ID = '$id'");
#-- SQL文を実行
$RESULT = $SQLstat->execute;
#-- 実行したSQL文を破棄
$SQLstat->finish;
SQL文内に変数を用いる場合も、数値以外はシングルクォーテーション「'」で括ること。
各SQL文を execute すると、結果が変数 $RESULT に代入される。
$RESULT に代入される値はSQL文実行によって変更のあった列数なので、処理実行後 $RESULT の値を調べることで、エラーチェックができる。
#-- エラーチェック
if($RESULT < 1){die print 'データの編集に失敗しました';}
データの検索
データベース内のデータの検索のためのSQL文(select)の使用例。
#-- SQL文を変数 $SQLstatに格納
$SQLstat = $DB->prepare("select * from $table_name where Name like '%$name%'");
#-- SQL文を実行
$SQLstat->execute;
#-- マッチした件数を取得
$match = $SQLstat->rows;
print qq|$match 件 マッチしました。\n\n|;
#-- マッチしたデータを配列 @DATA に順番に格納
while(@DATA = $SQLstat->fetchrow_array){
($ID,$NAME,$PASS,$MAIL,$BIRTH) = @DATA;
print qq|ID: $ID\n|;
print qq|Name: $NAME\n|;
print qq|Password: $PASS\n|;
print qq|Email: $MAIL\n|;
print qq|Birthday: $BIRTH\n|;
print qq|\n|;
}
#-- 実行したSQL文を破棄
$SQLstat->finish;
rows は、execute したSQL文にマッチした列数を返す。
fetchrow_array は、実行されるたびに、execute したSQL文で取り出した列を順番に一行ずつ配列として返す。
プレースホルダ
下記のように、ループの中で何度も似たようなSQL文を prepare して execute して finish するのは非効率的らしい。
foreach $ID (keys(%NAME)){
$SQLstat = $DB->prepare("update $table_name set Name='$NAME{'$ID'}' where ID = $ID");
$RESULT = $SQLstat->execute;
$SQLstat->finish;
if($RESULT < 1){die print qq|ID: $ID, Name: $NAME{'$ID'} の更新に失敗しました。\n|;}
}
こういう時は、ループの外でSQL文を prepare し、変数が入る部分には「?」を入れておく。
この「?」をプレースホルダと呼ぶらしい。
$SQLstat = $DB->prepare("update $table_name set Name=? where ID = ?");
foreach $ID (keys(%NAME)){
$RESULT = $SQLstat->execute($NAME{'$ID'},$ID);
if($RESULT < 1){die print qq|ID: $ID, Name: $NAME{'$ID'} の更新に失敗しました。\n|;}
}
$SQLstat->finish;
このように、execute する際にプレースホルダにバインドする順番に変数を渡してやると、意図通りに実行される。
また、execute する前に bind_param でプレースホルダにバインドする値を指定する方法もある。
$SQLstat = $DB->prepare("update $table_name set Name=? where ID = ?");
foreach $ID (keys(%NAME)){
$SQLstat->bind_param(1,$NAME{'$ID'});
$SQLstat->bind_param(2,$ID);
$RESULT = $SQLstat->execute;
if($RESULT < 1){die print qq|ID: $ID, Name: $NAME{'$ID'} の更新に失敗しました。\n|;}
}
$SQLstat->finish;
bind_param 時に渡す値は「何番目のプレースホルダなのか」という数値と、「バインドする値」の二つ。
データベースとの接続を終了する
データベースを操作する処理が終了したら、データベースとの接続を終了する。
#-- データベースとの接続を終了
$DB->disconnect;
PostgreSQLで複数テーブルを結合して効率的にデータ処理を行う方法
2007.11.26
PostgreSQLを使って、複数のテーブルを結合し、効率的にデータを取得・処理する方法について解説します。実際のショッピングサイトのデータを例に、INNER JOIN句を使って、ユーザー情報と注文情報を一度のクエリで結合する方法を紹介。
CPANの基本操作と古いモジュールのインストール方法
2025.01.31
Perl開発で欠かせないCPANを活用するための基本操作について解説します。特に、古いバージョンのモジュールをインストールする手順も丁寧に紹介しています。
Perlのデバッグを効率化するためのData::Dumper活用法
2025.01.29
Perlのデバッグに便利なData::Dumperの使い方を解説します。変数や配列の出力方法、ネスト構造の扱い、出力フォーマットのカスタマイズなど、効率的なデバッグ手法について具体例を交えながら紹介します。
XAMPP環境にStrawberry Perlを導入する方法:Windowsでの設定手順
2025.01.27
Windows版XAMPPに同梱されている簡易版Perlを、より機能豊富なStrawberry Perlに置き換える手順を解説します。ダウンロードから環境変数の設定、動作確認まで、順を追って説明しています。