--[[プログラミングガイド]]~ *Perl+DBI/DBDでFirebirdをアクセス [#f6d44328] Perl から Firebird にアクセスするための専用モジュールとして IBPerl と いうものがありますが、IBPerl は何年か前に開発が終了しており、最近では DBI によるアクセスが推奨されています。~ ここでは、Windows + ActivePerl での入手・インストール法と簡単な使用例 を書きます。~ 全ての情報は 2004/08/03 現在での最新です。 #contents **DBI/DBDとは? [#p9c1da51] Perlから各種データベースを共通の手段でアクセスするためのモジュールです。 DBDは DBI で使用するドライバで、データベースごとに用意されています。~ Firebirdには専用の DBD は今のところ用意されていないようなので、InterBase用 の DBD を使用します。Firebird1.5/IB6.01までの動作が確認されているようです。~ 他には ODBC 用の DBD も存在しますので、そちらを使用することも可能です。 その場合は、Firebird 用 ODBCドライバも別途に必要となりますし、使用例も ODBC用に合わせて修正の必要があります。 **下準備 [#ucce3ed8] ActivePerlを普通にインストールすれば、ppmというコマンドにパスが通ります ので、これを使用してモジュールのインストールを行います。パスが通っていない 場合は、手動で通しておいてください。~ ''DBDがfbclient.dllを参照しますので、インストールしたFirebirdのbinディレクトリへ実行パスが通っていることを確認してください。'' パスが通っていない場合、スクリプト実行時にデータベース接続の段階で失敗します。 **DBDの入手 [#b9d22fc3] IB用DBDを[[SourceForgeの開発プロジェクト:http://sourceforge.net/projects/dbi-interbase/]] から入手します。ソースとppmの2種類があると思いますが、使用にはppmのみを入手 すればとりあえず問題ありません。2004/08/02現在での最新版はV0.43です。~ ppm形式をダウンロードする場合は、使用する Perl のバージョンに合っている ものをダウンロードして下さい。今のところは5.6用と5.8用の2種類があるようです。~ zip形式で圧縮されていますので、適当なフォルダに展開してください。 (ここでは、Cドライブの\ExDBD_IBに展開したものとして以後の例を示します) **DBIの入手 [#s5049523] ppmコマンドを使用してオンラインで入手します。インストール作業と同時に 行いますので、特にファイルとして入手する必要はありません。~ **インストール [#nac7172a] ***DBIのインストール [#e7c02c4c] ppmコマンドを使用して、オンラインでモジュールをダウンロードしインストールを 行います。具体的には、 ppm install DBI とコマンドラインから打ち込みます。ちなみに、インストール済みの場合はその旨 を示すメッセージが出ます。~ インストールに成功した場合は、最終的に以下のようなコンソール表示になるはず です。 C:\>ppm install DBI ==================== Install 'DBI' version 1.43 in ActivePerl 5.8.3.809. ==================== Downloaded 513616 bytes. Extracting 69/69: blib/arch/auto/DBI/Driver_xst.h Installing C:\Perl\site\lib\auto\DBI\dbd_xsh.h Installing C:\Perl\site\lib\auto\DBI\DBI.bs Installing C:\Perl\site\lib\auto\DBI\DBI.dll Installing C:\Perl\site\lib\auto\DBI\DBI.exp Installing C:\Perl\site\lib\auto\DBI\DBI.lib Installing C:\Perl\site\lib\auto\DBI\dbipport.h Installing C:\Perl\site\lib\auto\DBI\dbivport.h Installing C:\Perl\site\lib\auto\DBI\DBIXS.h Installing C:\Perl\site\lib\auto\DBI\dbi_sql.h Installing C:\Perl\site\lib\auto\DBI\Driver.xst Installing C:\Perl\site\lib\auto\DBI\Driver_xst.h Installing C:\Perl\html\bin\dbiprof.html Installing C:\Perl\html\bin\dbiproxy.html Installing C:\Perl\html\site\lib\DBI.html Installing C:\Perl\html\site\lib\Bundle\DBI.html Installing C:\Perl\html\site\lib\DBD\DBM.html Installing C:\Perl\html\site\lib\DBD\File.html Installing C:\Perl\html\site\lib\DBD\Proxy.html Installing C:\Perl\html\site\lib\DBD\Sponge.html Installing C:\Perl\html\site\lib\DBI\Changes.html Installing C:\Perl\html\site\lib\DBI\DBD.html Installing C:\Perl\html\site\lib\DBI\FAQ.html Installing C:\Perl\html\site\lib\DBI\Profile.html Installing C:\Perl\html\site\lib\DBI\ProfileData.html Installing C:\Perl\html\site\lib\DBI\ProfileDumper.html Installing C:\Perl\html\site\lib\DBI\ProxyServer.html Installing C:\Perl\html\site\lib\DBI\PurePerl.html Installing C:\Perl\html\site\lib\DBI\W32ODBC.html Installing C:\Perl\html\site\lib\DBI\Const\GetInfoReturn.html Installing C:\Perl\html\site\lib\DBI\Const\GetInfoType.html Installing C:\Perl\html\site\lib\DBI\Const\GetInfo\ANSI.html Installing C:\Perl\html\site\lib\DBI\Const\GetInfo\ODBC.html Installing C:\Perl\html\site\lib\DBI\DBD\Metadata.html Installing C:\Perl\html\site\lib\DBI\ProfileDumper\Apache.html Installing C:\Perl\html\site\lib\DBI\SQL\Nano.html Installing C:\Perl\html\site\lib\Win32\DBIODBC.html Files found in blib\arch: installing files in blib\lib into architecture dependent library tree Installing C:\Perl\site\lib\DBI.pm Installing C:\Perl\site\lib\Bundle\DBI.pm Installing C:\Perl\site\lib\DBD\DBM.pm Installing C:\Perl\site\lib\DBD\ExampleP.pm Installing C:\Perl\site\lib\DBD\File.pm Installing C:\Perl\site\lib\DBD\NullP.pm Installing C:\Perl\site\lib\DBD\Proxy.pm Installing C:\Perl\site\lib\DBD\Sponge.pm Installing C:\Perl\site\lib\DBI\Changes.pm Installing C:\Perl\site\lib\DBI\DBD.pm Installing C:\Perl\site\lib\DBI\FAQ.pm Installing C:\Perl\site\lib\DBI\Profile.pm Installing C:\Perl\site\lib\DBI\ProfileData.pm Installing C:\Perl\site\lib\DBI\ProfileDumper.pm Installing C:\Perl\site\lib\DBI\ProxyServer.pm Installing C:\Perl\site\lib\DBI\PurePerl.pm Installing C:\Perl\site\lib\DBI\W32ODBC.pm Installing C:\Perl\site\lib\DBI\Const\GetInfoReturn.pm Installing C:\Perl\site\lib\DBI\Const\GetInfoType.pm Installing C:\Perl\site\lib\DBI\Const\GetInfo\ANSI.pm Installing C:\Perl\site\lib\DBI\Const\GetInfo\ODBC.pm Installing C:\Perl\site\lib\DBI\DBD\Metadata.pm Installing C:\Perl\site\lib\DBI\ProfileDumper\Apache.pm Installing C:\Perl\site\lib\DBI\SQL\Nano.pm Installing C:\Perl\site\lib\Win32\DBIODBC.pm Installing C:\Perl\bin\dbiprof Installing C:\Perl\bin\dbiprof.bat Installing C:\Perl\bin\dbiproxy Installing C:\Perl\bin\dbiproxy.bat Successfully installed DBI version 1.43 in ActivePerl 5.8.3.809. C:\> ***DBDのインストール [#va42b45d] ppmコマンドを使用してインストールを行います。ダウンロードしたファイル をすべて適当なディレクトリ(今回はC:\ExDBD_IB)に展開しておいてください。 IB用DBDは、現在のところではオンラインインストールは出来ないようです。~ インストールを行うには、zipを展開したディレクトリに移動した後に、 ppm install DBD-InterBase.ppd とコマンドラインから打ち込みます。ちなみに、インストール済みの場合は その旨を示すメッセージが出ます。~ インストールに成功した場合は、最終的に以下のようなコンソール表示に なるはずです。 C:\>cd ExDBD_IB C:\ExDBD_IB>ppm install DBD-InterBase.ppd ==================== Install 'DBD-InterBase' version 0.43 in ActivePerl 5.8.3.809. ==================== Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.bs Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.dll Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.exp Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.lib Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.pdb Files found in blib\arch: installing files in blib\lib into architecture dependent library tree Installing C:\Perl\site\lib\Bundle\DBD\InterBase.pm Installing C:\Perl\site\lib\DBD\InterBase.pm Installing C:\Perl\site\lib\DBD\InterBase\FAQ.pm Installing C:\Perl\site\lib\DBD\InterBase\GetInfo.pm Successfully installed DBD-InterBase version 0.43 in ActivePerl 5.8.3.809. C:\ExDBD_IB> **スクリプトを実行させて確認 [#zc8a3705] 実際に、Perlのスクリプトを走らせて見て動作確認を行います。ActivePerlの 場合、通常は拡張子で関連付けが行われているので、拡張子を".pl"に設定すれば コマンドプロンプトからそのまま実行できます。 ***接続確認 [#v089cb8f] 単純な接続確認です。以下のスクリプトを"test.pl"のファイル名で保存してください。 ホストやデータベースのパスの設定は、環境に合わせて変更する必要があります。~ &br; test.plのリスト: #!/usr/bin/perl # 接続テスト : test.pl use DBI; # パラメータ設定 $host = 'localhost'; $dbpath = 'e:/firebird/TEST.FDB'; $user = 'SYSDBA'; $password = 'masterkey'; # ※ドライバの指定はコロン(:)で、IB/FB用の接続パラメータは # セミコロン(;)で区切らなければならないので注意。 $data_source = 'dbi:InterBase:' . "host=$host;dbname=$dbpath"; $dbh = DBI->connect($data_source, $user, $password); unless($dbh) { print STDERR "Error : connect.\n"; exit -1; } $dbh->disconnect(); print STDERR "Succses.\n"; &br; とりあえず、実行してみましょう。 &br; test.plの実行例(成功時): C:\>test.pl Succses. ***単純SELECT実行 [#l171c001] 単純なSELECT文の実行です。以下のスクリプトを"select.pl"のファイル名で保存してください。 ホストやデータベースのパスの設定は、環境に合わせて変更する必要があります。~ &br; select.plのリスト: #!/usr/bin/perl # SELECT テスト : select.pl # テーブルの名前は、コマンドライン引数で指定する。 use DBI; # パラメータ設定 $host = 'localhost'; $dbpath = 'e:/firebird/TEST.FDB'; $user = 'SYSDBA'; $password = 'masterkey'; # ※ドライバの指定はコロン(:)で、IB/FB用の接続パラメータは # セミコロン(;)で区切らなければならないので注意。 $data_source = 'dbi:InterBase:' . "host=$host;dbname=$dbpath"; $dbh = DBI->connect($data_source, $user, $password); unless($dbh) { print STDERR "Error : connect.\n"; exit -1; } #クエリの作成 $sql = "SELECT * FROM $ARGV[0]"; $sth = $dbh->prepare($sql); if ($sth) { $sth->execute(); #パラメータ指定はなし while ($result = $sth->fetchrow()) { print "$result\n"; } $sth->finish(); } else { print STDERR "Error : prepare.\n"; } $dbh->disconnect(); &br; コマンドラインでテーブル名を指定して実行します。 &br; select.plの実行例: C:\>select.pl TEST 1 アイテム� **接続パラメータの説明 [#yb17e531] DBI::connectで指定する接続パラメータは次のようになっています。 必須項目はデータベース名のみです。大抵はデータベース名とホスト名の指定 程度での使用が多いでしょう。~ |パラメータ|説明|必須項目|h |database&br;又はdbname&br;又はdb|データベース名|○| |host|ホスト名|| |port|ポート番号|| |ib_dialect|Dialect数|| |ib_role|ロール名|| |ib_charset|キャラクタセットの指定|| |ib_cache|キャッシュバッファサイズ|| 実際の指定は、InterBase用DBD使用の指定と、独自の接続パラメータの指定 を同時に行います。同時の接続パラメータが複数ある場合は、パラメータの間を セミコロンで区切ります。~ 例えば、次のような形になります。 $dbh = DBI->connect("dbi:InterBase:dbname=$dbname","sysdba","masterkey"); マルチラインでの指定も可能です。 $dsn =<< "DSN"; dbi:InterBase:dbname=$dbname; host=$host; port=$port; ib_dialect=$dialect; ib_role=$role; ib_charset=$charset; ib_cache=$cache DSN $dbh = DBI->connect($dsn, $username, $password);