Perl+DBI/DBDでFirebirdをアクセス

 Perl から Firebird にアクセスするための専用モジュールとして IBPerl と いうものがありますが、IBPerl は何年か前に開発が終了しており、最近では DBI によるアクセスが推奨されています。
 ここでは、Windows + ActivePerl での入手・インストール法と簡単な使用例 を書きます。
 全ての情報は 2004/08/03 現在での最新です。

DBI/DBDとは?

 Perlから各種データベースを共通の手段でアクセスするためのモジュールです。 DBDは DBI で使用するドライバで、データベースごとに用意されています。
 Firebirdには専用の DBD は今のところ用意されていないようなので、InterBase用 の DBD を使用します。Firebird1.5/IB6.01までの動作が確認されているようです。
 他には ODBC 用の DBD も存在しますので、そちらを使用することも可能です。 その場合は、Firebird 用 ODBCドライバも別途に必要となりますし、使用例も ODBC用に合わせて修正の必要があります。

下準備

 ActivePerlを普通にインストールすれば、ppmというコマンドにパスが通ります ので、これを使用してモジュールのインストールを行います。パスが通っていない 場合は、手動で通しておいてください。
 DBDがfbclient.dllを参照しますので、インストールしたFirebirdのbinディレクトリへ実行パスが通っていることを確認してください。 パスが通っていない場合、スクリプト実行時にデータベース接続の段階で失敗します。

DBDの入手

 IB用DBDをSourceForgeの開発プロジェクト から入手します。ソースとppmの2種類があると思いますが、使用にはppmのみを入手 すればとりあえず問題ありません。2004/08/02現在での最新版はV0.43です。
 ppm形式をダウンロードする場合は、使用する Perl のバージョンに合っている ものをダウンロードして下さい。今のところは5.6用と5.8用の2種類があるようです。
 zip形式で圧縮されていますので、適当なフォルダに展開してください。 (ここでは、Cドライブの\ExDBD_IBに展開したものとして以後の例を示します)

DBIの入手

 ppmコマンドを使用してオンラインで入手します。インストール作業と同時に 行いますので、特にファイルとして入手する必要はありません。

インストール

DBIのインストール

 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のインストール

 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>

スクリプトを実行させて確認

 実際に、Perlのスクリプトを走らせて見て動作確認を行います。ActivePerlの 場合、通常は拡張子で関連付けが行われているので、拡張子を".pl"に設定すれば コマンドプロンプトからそのまま実行できます。

接続確認

 単純な接続確認です。以下のスクリプトを"test.pl"のファイル名で保存してください。 ホストやデータベースのパスの設定は、環境に合わせて変更する必要があります。

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";


 とりあえず、実行してみましょう。
test.plの実行例(成功時):

C:\>test.pl
Succses.

単純SELECT実行

 単純なSELECT文の実行です。以下のスクリプトを"select.pl"のファイル名で保存してください。 ホストやデータベースのパスの設定は、環境に合わせて変更する必要があります。

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();


 コマンドラインでテーブル名を指定して実行します。
select.plの実行例:

C:\>select.pl TEST
1
アイテム�

接続パラメータの説明

 DBI::connectで指定する接続パラメータは次のようになっています。 必須項目はデータベース名のみです。大抵はデータベース名とホスト名の指定 程度での使用が多いでしょう。

パラメータ説明必須項目
database
又はdbname
又はdb
データベース名
hostホスト名
portポート番号
ib_dialectDialect数
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);