技術資料

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句を使って、ユーザー情報と注文情報を一度のクエリで結合する方法を紹介。

Perl PostgreSQL

CPANの基本操作と古いモジュールのインストール方法

2025.01.31

Perl開発で欠かせないCPANを活用するための基本操作について解説します。特に、古いバージョンのモジュールをインストールする手順も丁寧に紹介しています。

CPAN Perl

Perlのデバッグを効率化するためのData::Dumper活用法

2025.01.29

Perlのデバッグに便利なData::Dumperの使い方を解説します。変数や配列の出力方法、ネスト構造の扱い、出力フォーマットのカスタマイズなど、効率的なデバッグ手法について具体例を交えながら紹介します。

Perl

XAMPP環境にStrawberry Perlを導入する方法:Windowsでの設定手順

2025.01.27

Windows版XAMPPに同梱されている簡易版Perlを、より機能豊富なStrawberry Perlに置き換える手順を解説します。ダウンロードから環境変数の設定、動作確認まで、順を追って説明しています。

Perl XAMPP

阿部辰也へのお仕事の依頼・お問い合わせ

お名前 *必須
会社名
メールアドレス *必須
電話番号
URL
お問い合わせのきっかけ
お問い合わせの内容 *必須
個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP