Top > Perlあれこれ > DBD::PgPPを使用したPostgresへのアクセス
ここでは、DBI - DBD::PgPPを使用してPostgreSQLへアクセスするサンプルを示します。

----
#contents
----

* 環境[#qdaa31fd]
&size(20){●OS};&br;
> WindowsXP SP3

&size(20){●Apache + Perl [[ダウンロード先:http://www.apachefriends.org/jp/xampp-windows.html]]};&br;
> XAMPP1.7.2&br;
> をデフォルトの場所にインストールします("c:\\xampp"がインストールホーム)。

&size(20){●PostgreSQL[[ダウンロード先:http://www.postgresql.jp/]]};&br;
>   PostgreSQL8.4.5&br;
> を次の場所にインストールします("C:\PostgreSQL\8.4")。

* Windowsの環境変数PATHの設定 [#o2566acc]
** Perlモジュールのパスを追加する。 [#qcb2d809]
> C:\xampp\perl\bin
** PostgreSQLモジュールのパスを追加する。 [#i63f9aa0]
> C:\PostgreSQL\8.4\bin

* PostgreSQLのデータベースセットアップ [#f559fa57]
** ユーザーの作成[#i4ae5d28]
ユーザーの作成を行います。ここでは、"maomao"ユーザーを作成します。
 C:\>createuser -d -U postgres -P maomao
 新しいロールのパスワード:  ["maomao"ユーザーのパスワード]
 もう一度入力してください:  ["maomao"ユーザーのパスワード]
 新しいロールをスーパーユーザとしますか?  (y/n)n
 新しいロールにロールを作成する権限を与えますか? (y/n)n
※-d:データベースの作成権限を付与します。

** データベースの作成 [#c48216ff]
データベースの作成を行ないます。ここでは、所有者を"maomao"ユーザー、データベース名を"maomao_db"として作成します。
 C:\>createdb -E UTF-8 -O maomao -U maomao maomao_db
 パスワード:  ["maomao"ユーザーのパスワード]
※-O:所有者&br;
※-U:接続ユーザー

** テーブルの作成 [#y74b0b8d]
とりあえずのテーブルを作成します。
 C:\>psql -U maomao maomao_db
でデータベースに接続して、以下のSQLを実行します。

#code(sql){{
CREATE TABLE department
(
   id integer NOT NULL, 
   "name" character varying(255) NOT NULL, 
    PRIMARY KEY (id)
);
 
INSERT INTO DEPARTMENT VALUES(1,'ACCOUNTING');
INSERT INTO DEPARTMENT VALUES(2,'RESEARCH');
INSERT INTO DEPARTMENT VALUES(3,'SALES');
INSERT INTO DEPARTMENT VALUES(4,'OPERATIONS');
}}

* DBD::PgPPのインストール [#o2566acc]
DBD::PgPPのインストールは、ppmツールを使用して行ないます。DOSプロンプトから、ppmツールを起動して、以下のようにインストール操作を行ないます。
 C:\>ppm
 PPM interactive shell (2.1.6) - type 'help' for available commands.
 PPM> install DBD::PgPP
 Install package 'DBD-PgPP?' (y/N): y
 Installing package 'DBD-PgPP'...
 Bytes transferred: 22178
 Installing C:\xampp\perl\html\site\lib\DBD\PgPP.html
 Installing C:\xampp\perl\site\lib\DBD\PgPP.pm
 PPM>

* サンプルソース [#xbf76060]
** サンプルソース(1)一覧取得編(コマンドライン) [#bcd7acac]
#code(perl){{
use DBI;
use Encode;

# データベース接続情報を設定
$dbname = "maomao_db";
$host = "localhost";
$user = "maomao";
$password = "maomao";

# データベースへの接続。ここで、PgPP という名前の DBD を指定しています。
$conn = DBI->connect("dbi:PgPP:dbname=$dbname;host=$host", $user, $password ) or die;

$sql = "select * from department";

# SQL の発行
$sth = $conn->prepare($sql);
$sth->execute or die "Can not execute statement: ". $sth->errstr;

# レコード行をハッシュへのリファレンスとして取得します。
while ($href = $sth->fetchrow_hashref) {
  print $href->{"id"} . "\n";
  # UTF-8→shift-jisへ変換
  print encode('shift-jis', decode('utf-8', $href->{"name"} ."\n"));
}

$sth->finish;
$conn->disconnect;

}}

** サンプルソース(2)一覧取得編(CGI) [#bcd7acac]
以下のファイルを、
> C:\xampp\cgi-bin

に配置して、ブラウザから以下のURLにアクセスします。
>http://localhost/cgi-bin/sample1.pl

#code(perl){{
#!"C:\xampp\perl\bin\perl.exe"
use DBI;
use Encode;

print "Content-type: text/plain; charset=UTF-8\n\n";

# データベース接続情報を設定
$dbname = "maomao_db";
$host = "localhost";
$user = "maomao";
$password = "maomao";

# データベースへの接続。ここで、PgPP という名前の DBD を指定しています。
$conn = DBI->connect("dbi:PgPP:dbname=$dbname;host=$host", $user, $password ) or die;

$sql = "select * from department";

# SQL の発行
$sth = $conn->prepare($sql);
$sth->execute or die "Can not execute statement: ". $sth->errstr;

# レコード行をハッシュへのリファレンスとして取得します。
while ($href = $sth->fetchrow_hashref) {
  print $href->{"id"} . "\n";
  print $href->{"name"} ."\n";
}

$sth->finish;
$conn->disconnect;
}}

** サンプルソース(3)トランザクション編(コマンドライン) [#bcd7acac]
以下のソースコードをsample3.plというファイルで作成する。DOSプロンプトから以下の通りに実行します。
> perl sample3.pl

#code(perl){{
use DBI;
use Encode;
 
# データベース接続情報を設定
$dbname = "maomao_db";
$host = "localhost";
$user = "maomao";
$password = "maomao";
 
# データベースへの接続。ここで、PgPP という名前の DBD を指定しています。
$conn = DBI->connect("dbi:PgPP:dbname=$dbname;host=$host", $user, $password) or die;
 
#オートコミットをオフにします。
$conn->{AutoCommit} = 0;
#エラーメッセージの自動表示を抑止します。
$conn->{PrintError} = 0;
 
$sql = "INSERT INTO department(id, name) VALUES (?, ?);";
 
# SQL の発行
$sth = $conn->prepare($sql);
 
#トランザクション制御のためevalでdieをトラップします。
eval {
  #RaiseErrorに"1"を設定することで、エラー発生時に自動的にdieするようになります。
  #→自動的に実行されるdieは次の通り die("$class $method failed $DBI::errstr")
  $sth->{RaiseError} = 1;
  $sth->execute(7, "BBB");
  $sth->execute(8, "AAA");
};
 
if ($@) {
  #・rollbackをすると、"$@"の内容がクリアされてしまうので、順番に注意
  #・DBのエンコーディングはUTF8のため(?)、エラーメッセージはUTF8になります。
  # ここでは、DOSプロンプトで実行しているためShift-JISに変換しています。
  warn "Transaction aborted because". encode('shift-jis', decode('utf-8', $@ ."\n"));
  $conn->rollback;
} else {
  print "SUCCESS: insert.\n";
  $conn->commit;
}
 
$sth->finish;
$conn->disconnect;
}}

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS