perlでPostgreSQL
今回も旧サイトからネタを引っ張ってきました。すんません。
PostgreSQL関連は早めに転載しとかないと、色々と困るので......。
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;
- 現在位置
- TOP > Web制作技術 > PostgreSQL > perlでPostgreSQL
- 前のブログ記事
- au(EZweb)向けサイトで音声ファイルを配布する方法 [2007年8月10日 23:44]
- 次のブログ記事
- 「アインシュタインLOVE」展を見に、大丸ミュージアム・梅田に行ってきました [2007年8月12日 23:59]







コメント(0)
コメントする