Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. モジュール
  3. データベース
  4. DBIx::Custom
  5. 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認証が有効になっていないと接続できませんので、どのような設定になっているかを確認する必要があります。

Windows認証と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のデフォルトのオプションと、自分で指定したオプションを渡してください。

Giblog