- Perl ›
- モジュール ›
- データベース ›
- DBIx::Custom ›
- here
DBIx::Customで「データベース接続」する方法
データベースへ接続するにはconnectメソッドを使用します。データベースとしてSQLiteに接続してみます。
my $dbi = DBIx::Custom->connect( dsn => "dbi:SQLite:dbname=bookshop" );
データベースに接続するためにはdsnにデータソース名を指定します。データソースは各データベースに依存したものになります。接続に成功するとDBIx::Customオブジェクトが戻り値として返ります。
ユーザー名とパスワード
データベースへの接続にユーザー名とパスワードが必要な場合はuserとpasswordを使用します。
my $dbi = DBIx::Custom->connect( dsn => "dbi:SQLite:dbname=bookshop", user => 'ken', password => 'utj4857' );
DBIのオプション
DBIのオプションはoptionで指定することができます。
my $dbi = DBIx::Custom->connect( dsn => "dbi:SQLite:dbname=bookshop", option => {sqlite_unicode => 1} );
DBIのオプションにはデフォルトで以下の値が設定されます。エラーに対しては例外を投げ、コミットはオートコミットモードになっています。
{ RaiseError => 1, PrintError => 0, AutoCommit => 1 }
デフォルトのDBIのオプションは必要であればdefault_optionメソッドで取得できます。
my $default_option = DBIx::Custom->new->default_option;
MySQLへ接続する
connectメソッドを使用してMySQLに接続するには次のようにします。
my $dbi = DBIx::Custom->connect( dsn => "dbi:mysql:database=bookshop", user => 'ken', password => '!LFKD%$&', option => {mysql_enable_utf8 => 1} );
dsnにデータソース名、userにデータベースのユーザー名、passwordにデータベースのパスワードを指定します。optionにはDBIモジュールのオプションを指定します。戻り値はDBIx::Customオブジェクトになります。
DBIのオプションとしてmysql_enable_utf8に1を設定しておくと、Perlの内部文字列を自動的にUTF-8バイト文字列に変換してくれるので便利です。
またMySQLではホスト名やポート番号を指定してリモートにあるMySQLサーバーに簡単に接続することができます。
my $dbi = DBIx::Custom->connect( dsn => "dbi:mysql:database=bookshop;host=somehost.com;port=3306", user => 'ken', password => '!LFKD%$&', );
PostgreSQLへ接続する
connectメソッドを使用してPostgreSQLに接続するには次のようにします。
my $dbi = DBIx::Custom->connect( dsn => "dbi:Pg:dbname=bookshop", user => 'ken', password => '!LFKD%$&', option => {pg_enable_utf8 => 1} );
dsnにデータソース名、userにデータベースのユーザー名、passwordにデータベースのパスワードを指定します。optionにはDBIモジュールのオプションを指定します。戻り値はDBIx::Customオブジェクトになります。
DBIのオプションとしてpg_enable_utf8に1を設定しておくと、Perlの内部文字列を自動的にUTF-8バイト文字列に変換してくれるので便利です。
またMySQLではホスト名やポート番号を指定してリモートにあるPostgreSQLサーバーに簡単に接続することができます。
my $dbi = DBIx::Custom->connect( dsn => "dbi:Pg:dbname=$dbname;host=somehost.com;port=5432;", user => 'ken', password => '!LFKD%$&', );
SQLiteへ接続する
connectメソッドを使用してSQLiteに接続するには次のようにします。
my $dbi = DBIx::Custom->connect( dsn => "dbi:SQLite:dbname=$database", option => {sqlite_unicode => 1} );
dsnにデータソース名を指定します。optionにはDBIモジュールのオプションを指定します。戻り値はDBIx::Customオブジェクトになります。
DBIのオプションとしてsqlite_unicodeに1を設定しておくと、Perlの内部文字列を自動的にUTF-8バイト文字列に変換してくれるので便利です。
またSQLiteでは試験などを行うときにメモリ上にデータベースを作成できるのが便利です。
my $dbi = DBIx::Custom->connect( dsn => "dbi:SQLite:dbname=:memory:" );
Oracleへ接続する
connectメソッドを使用してOracleに接続するには次のようにします。
ネットサービス名で接続する場合
Oracleにはネットサービス名で接続する場合は次のような記述になります。
# Connect to Oracle(Net servrice name) my $dbi = DBIx::Custom->connect(dsn => "dbi:Oracle:$net_service_name");
ネットサービス名で接続する場合はtnsnames.oraというファイルにネットサービス名を定義しておく必要があります。
tnsnames.oraは以下のパスに配置する必要があります。
$ORACLE_HOME/network/admin/tnsnames.ora
以下はtnsnames.oraのサンプルです。
mydb = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) (CONNECT_DATA = (SID = XE) ) )
この場合はmydbというのがネットサービス名になります。SIDの部分にデータベース名を指定します。この例ではXEがデータベース名です。
tnsnames.oraについてはこちらの解説が詳しいです。
直接データベース名を指定する場合
直接データベース名を指定する場合は次のようにします。
# Connect to Oracle (SID) my $dbi = DBIx::Custom->connect( dsn => 'dbi:Oracle:host=localhost;port=1521;sid=$database', );
sidがデータベース名を指定する部分になります。たとえばOracleのExpression版を利用してる場合はEXを指定すると接続できます。ポート番号を指定しない場合は1526,1521の順に自動的にポートを試してくれます。
Oracleにおけるデータベース名
Oracleにおいてはデータベース名と呼ばれるものが非常に多いです。Oracleのデータベース名についてはこちらの解説が詳しいです。
ODBC経由でMicrosoft SQL Serverへ接続する
DBIx::Customのconnectメソッドを使用してODBC経由でMicrosoft SQL Serverに接続するには次のようにします。
Windows認証の場合
# Data source name (Windows authentication) my $dsn = "dbi:ODBC:driver={SQL Server};Server={localhost\\SQLEXPRESS};" . "Trusted_Connection=yes;AutoTranslate=No;Database=master;"; # Connect my $dbi = DBIx::Custom->connect(dsn => $dsn);
データソース名の始まりは「dbi:ODBC:」になります。driverの値は{SQL Server}です。Serverに指定する値は、「ホスト名\\オブジェクト名」とする必要があります。
Windows認証を使う場合はTrusted_Connectionに値をyesにします。AutoTranslateはデータの自動変換に関係しますが通常はNoに設定します。Databaseに、接続したいデータベース名を指定することができます。
またポート番号を指定したい場合はServerの値は次のように設定します。
# With port number Server={localhost\\SQLEXPRESS,1433}
この設定はDBIx::Customではなくて普通のDBIを使って行う場合も同様です。
SQL Server認証の場合
# Data source name (SQL Server authentication) my $dsn = "dbi:ODBC:driver={SQL Server};Server={localhost\\SQLEXPRESS};" . "Trusted_Connection=No;AutoTranslate=No;Database=master;"; # Connect my $dbi = DBIx::Custom->connect(dsn => $dsn, user => 'kimoto', password => 'iejfid');
Windows認証の場合とほとんどおなじですが、SQL Server 認証の場合はTrusted_Connectionの部分をNoにします。またSQL Server認証はパスワードによる認証ですのでpasswordも指定します。
またSQL Server認証で接続したい場合は、SQL Server認証が有効になっていないと接続できませんので、どのような設定になっているかを確認する必要があります。
設定を変更した後はSQL Serverを再起動することを忘れないでください。
Microsoft Accessへ接続する
connectメソッドを使用してODBC経由でMicrosoft Accessに接続するには次のようにします。(この接続方法はPerlと生のDBIを使う場合も同じになります。)
mdbファイル
my $dbi = DBIx::Custom->connect( dsn => "dbi:ODBC:driver=Microsoft Access Driver (*.mdb);dbq=hoge.mdb", );
dsnにデータソース名を指定します。戻り値はDBIx::Customオブジェクトになります。
mdbファイルではjoinがサポートされていない点に注意してください。これはMicrosoft Accessの制限になっています。
Microsoft Access 2007のaccdbファイル
まずこちらから2007用のODBCドライバをインストールする必要があります。
それからdsnを以下のように指定します。上記のmdbファイルを微妙に異なる({}で囲まれている)点に注意してください。
my $dbi = DBIx::Custom->connect( dsn => "dbi:ODBC:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=hoge.accdb", );
accdbファイルではjoinを利用することができますが、列の中に.(ドット)を含めることができないようです。以下のようにセパレータを「-」などに変更すると正しく利用することができます。
$dbi->separator('-');
Microsoft Access 2010のaccdbファイル
こちらから2010用のODBCドライバーをインストールする必要があります。
接続方法は2007のものと同じになります。
DB2へ接続する
connectメソッドを使用してDB2に接続するには次のようにします。
my $dbi = DBIx::Custom->connect( dsn => "dbi:DB2:db_name", user => $username, password => $password );
dsnにデータソース名を指定します。戻り値はDBIx::Customオブジェクトになります。
「DBIx::Connector」を利用する
本番機でWebアプリケーションを動かす場合は、データベースのコネクションの管理が必要になってきます。たとえば、長時間接続がない場合は、データベース側でそのコネクションが利用されていないものと判断して、切断される場合もあるでしょう。またプリフォークサーバーやmod_perl環境でWebアプリケーションを実行する場合も、意図せずにデータベースの接続が切断される場合もあるでしょう。
このような場合はコネクションマネージャーの出番です。データベースマネージャーであるDBIx::Connectorは、失われたコネクションを自動的に修復してくれます。DBIx::Customと一緒に使う場合はconnector属性に1を設定します。
my $dbi = DBIx::Custom->connect( dsn => "dbi:mysql:database=$database", user => $user, password => $password, dbi_option => {mysql_enable_utf8 => 1}, connector => 1 );
接続後はconnector属性で、DBIx::Connectorオブジェクトにアクセスできます。
my $connector = $dbi->connector;
トランザクションを実行したい場合は次のようにします。
$dbi->connector->txn(sub { # 処理1 ... # 処理2 ... });
より詳しい使い方については、DBIx::Connectorのドキュメントを見てください。
別のコネクションマネージャを使う
別のコネクションマネージャーを使うこともできます。コネクションマネージャーはdbhというメソッドを持っていることが必要です。
my $connector = DBIx::SomeConnector->new( "dbi:mysql:database=$database", $user, $password, { %{DBIx::Custom->new->default_dbi_option}, mysql_enable_utf8 => 1 } ); my $dbi = DBIx::Custom->connect(connector => $connector);
connectorにコネクションマネージャーオブジェクトを指定することができます。DBIのオプションには、DBIx::Customのデフォルトのオプションと、自分で指定したオプションを渡してください。