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]
コメント(6)
zpecceys http://usapaydayloans24.com/ payday loans
ifdrnvxg http://paydayloansqxi.com/ payday loans
vumtsnl http://paydayloansvmg.com/ payday loans
jsfyni http://paydayloansbra.com/ payday loans
Sildenafil viagra price relaxes muscles reveal in the walls of blood vessels and increases blood spring to circumstance areas of the body.
Sildenafil 100mg viagra price relaxes muscles develop in the walls of blood vessels and increases blood move to particular areas of the body.
コメントする