perlでPostgreSQL

2007年8月11日 23:59 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;
阿部辰也へのお仕事のご依頼・お問合せはこちら

Twitter始めました。Followはお気軽にどうぞ。

関連するブログ記事
スポンサード リンク
カテゴリー
PostgreSQL | perl/CGI
タグ
perl | PostgreSQL | RDBMS | SQL
現在位置
TOP > Web制作技術 > PostgreSQL > perlでPostgreSQL
前のブログ記事
au(EZweb)向けサイトで音声ファイルを配布する方法 [2007年8月10日 23:44]
次のブログ記事
「アインシュタインLOVE」展を見に、大丸ミュージアム・梅田に行ってきました [2007年8月12日 23:59]

トラックバック(0)

このブログ記事に対するトラックバックURL:

コメント(6)

payday loans [2014年1月31日 19:52]

zpecceys http://usapaydayloans24.com/ payday loans

payday loans [2014年8月18日 22:51]

ifdrnvxg http://paydayloansqxi.com/ payday loans

payday loans [2014年8月27日 23:35]

vumtsnl http://paydayloansvmg.com/ payday loans

payday loans [2014年11月 9日 18:28]

jsfyni http://paydayloansbra.com/ payday loans

hqtsnh [2017年1月14日 05:18]

Sildenafil viagra price relaxes muscles reveal in the walls of blood vessels and increases blood spring to circumstance areas of the body.

nhagnkl [2017年1月21日 16:38]

Sildenafil 100mg viagra price relaxes muscles develop in the walls of blood vessels and increases blood move to particular areas of the body.

コメントする


画像の中に見える文字を入力してください。

 

このブログについて

阿部辰也

Webコンサルタントやシステムエンジニア、執筆業などをやっている、グッドホープ代表・阿部辰也のブログです。
Web技術系のTipsから仕事の話、趣味の話まで色々と。
人生は所詮生まれてから死ぬまでの壮大な暇つぶし。
だったら有意義に暇をつぶして生きましょー。

阿部辰也へのお仕事のご依頼・問合せはこちらからどうぞ。

Twitter: @t_abe
読書メーター: ID:Tatsuya

このブログのサイトマップ
このブログのはてなブックマーク数

Feed/RSS購読

タグクラウド

最近のトラックバック

阿部辰也の著書

77のキーワードで知る インターネットで稼ぐ 図解 ブログ・メルマガ・Webサイト構築の基本

77のキーワードで知る インターネットで稼ぐ 図解 ブログ・メルマガ・Webサイト構築の基本

頑張って書いたのに、出版後すぐに出版社が倒産して印税も貰えずじまいで俺涙目(笑)。

Powered by Movable Type 5.02

スポンサード リンク

はてなブックマーク



あわせて読みたい

t-abeの今読んでる本

t-abeの最近読んだ本

t-abeの今やってるゲーム

t-abeの最近やったゲーム