PerlのDBIモジュールで始めるPostgreSQLデータベース操作入門
2007.08.11
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句を使って、ユーザー情報と注文情報を一度のクエリで結合する方法を紹介。
PHPとPerlでファイルパーミッションを変更する方法(chmod関数)
2024.11.16
PHPとPerlには、ファイルのパーミッションを変更するためのchmod関数が標準で用意されています。この記事では、PHPとPerlそれぞれのchmod関数を使ったファイルパーミッション変更の基本的な使い方を紹介します。
perlでの文字列置換と数値抽出の方法
2023.04.26
perlで特定の文字列から末尾のカンマ区切りの数値部分を抽出する方法を紹介します。s/// 演算子を使った文字列置換の例と、数値が含まれているかを正規表現でチェックする方法を解説します。
perlでMySQLを操作する基本的なテンプレート
2023.04.08
perlでMySQLデータベースを操作するための基本的なテンプレートを紹介します。DBIモジュールを使用してデータベースに接続し、SQLクエリを実行する方法を解説。