データベースへの接続

データベースへ接続するにはconnectメソッドを使用します。

# connectメソッド
DBIx::Custom->connect($dsn, $user, $password, $dbi_attr, $dbix_custom_attr);

第一引数はデータソース名、第二引数はユーザー名、第三引数はパスワード、第四引数はDBIの属性、第五引数は、DBIx::Customの属性です。

接続に成功するとDBIx::Customオブジェクトが戻り値として返ります。

以下の方法も提供されていますが、特に必要のない場合は、上記の方法を利用してください。

# connectメソッド(他のやり方)
my $dbi = DBIx::Custom->connect(
  dsn => $dsn,
  user => $user,
  password => $password,
  option => $dbi_attr,
  %dbix_custom_attr
);

データソース名

データソース名を指定してSQLiteに接続してみます。

my $dsn = "dbi:SQLite:dbname=bookshop";
my $dbi = DBIx::Custom->connect($dsn);

データベースに接続するためには、第一引数にデータソース名を指定します。データソースは各データベースごとに異なるものになります。接続に成功するとDBIx::Customオブジェクトが戻り値として返ります。

ユーザー名とパスワード

データベースへの接続にユーザー名とパスワードが必要な場合は、第二引数と第三引数に指定します。

my $user = 'ken';
my $password = 'utj4857';
my $dbi = DBIx::Custom->connect($dsn, $user, $password);

DBIの属性

DBIの属性は第四引数で指定することができます。第四引数まで、DBIのconnectメソッドの引数と同じです。ユーザーとパスワードが必要ない場合は、undefを設定してください。

my $dbi_attr = {sqlite_unicode => 1};
my $dbi = DBIx::Custom->connect($dsn, $user, $password, $dbi_attr);

DBIの属性にはデフォルトで以下の値が設定されます。エラーに対しては例外を投げ、コミットはオートコミットモードになっています。これは上書きすることができます。

{
  RaiseError => 1,
  PrintError => 0,
  AutoCommit => 1
}

データベースの接続管理

DBIx::Customの接続管理は、実績があり、信頼できるDBIx::Connectorによって行われます。

このためDBIx::Customは、プリフォークサーバーで、Webアプリケーションが実行された場合でも正しく動作します。

トランザクションの実行も、DBIx::Connectorのtxnメソッドによって実行できます。

# トランザクションの実行
$dbi->connector->txn(sub {
  # 処理1
  ...

  # 処理2
  ...
});

MariaDBへ接続する

connectメソッドを使用してMariaDBに接続するには次のようにします。

# UTF-8の場合
my $dbi = DBIx::Custom->connect("dbi:mysql:database=bookshop", 'ken', '!LFKD%$&', {mysql_enable_utf8mb4 => 1});

# 3バイトのUTF-8の場合
my $dbi = DBIx::Custom->connect("dbi:mysql:database=bookshop", 'ken', '!LFKD%$&', {mysql_enable_utf8 => 1});

第一引数にデータソース名、第二引数にデータベースのユーザー名、第三引数にデータベースのパスワードを指定します。第四引数にDBIの属性を指定します。戻り値はDBIx::Customオブジェクトになります。

DBIの属性としてmysql_enable_utf8mb4に1を設定しておくと、データベースの文字列を更新・取得するときに、Perlのデコードされた文字列とUTF-8バイト列を自動的に変換してくれるので便利です。3バイトのUTF-8しかサポートされていない、古いMariaDBの場合はmysql_enable_utf8を使うことができます。

またMariaDBではホスト名やポート番号を指定してリモートにあるMariaDBサーバーに簡単に接続することができます。

my $dbi = DBIx::Custom->connect("dbi:mysql:database=bookshop;host=somehost.com;port=3306", 'ken', '!LFKD%$&');

MySQLへ接続する

connectメソッドを使用してMySQLに接続するには次のようにします。

# UTF-8の場合
my $dbi = DBIx::Custom->connect("dbi:mysql:database=bookshop", 'ken', '!LFKD%$&', {mysql_enable_utf8mb4 => 1});

# 3バイトのUTF-8の場合
my $dbi = DBIx::Custom->connect("dbi:mysql:database=bookshop", 'ken', '!LFKD%$&', {mysql_enable_utf8 => 1});

第一引数にデータソース名、第二引数にデータベースのユーザー名、第三引数にデータベースのパスワードを指定します。第四引数にDBIの属性を指定します。戻り値はDBIx::Customオブジェクトになります。

DBIの属性としてmysql_enable_utf8mb4に1を設定しておくと、データベースの文字列を更新・取得するときに、Perlのデコードされた文字列とUTF-8バイト列を自動的に変換してくれるので便利です。3バイトのUTF-8しかサポートされていない、古いMySQLの場合はmysql_enable_utf8を使うことができます。

またMySQLではホスト名やポート番号を指定してリモートにあるMySQLサーバーに簡単に接続することができます。

my $dbi = DBIx::Custom->connect("dbi:mysql:database=bookshop;host=somehost.com;port=3306", 'ken', '!LFKD%$&');

PostgreSQLへ接続する

connectメソッドを使用してPostgreSQLに接続するには次のようにします。

my $dbi = DBIx::Custom->connect("dbi:Pg:dbname=bookshop", 'ken', '!LFKD%$&', {pg_enable_utf8  => 1});

第一引数にデータソース名、第二引数にデータベースのユーザー名、第三引数にデータベースのパスワードを指定します。第四引数にDBIの属性を指定します。戻り値はDBIx::Customオブジェクトになります。

DBIの属性としてpg_enable_utf8に1を設定しておくと、データベースの文字列を更新・取得するときに、Perlのデコードされた文字列とUTF-8バイト列を自動的に変換してくれるので便利です。

またPostgreSQLではホスト名やポート番号を指定してリモートにあるPostgreSQLサーバーに簡単に接続することができます。

my $dbi = DBIx::Custom->connect("dbi:Pg:dbname=$dbname;host=somehost.com;port=5432;", 'ken', '!LFKD%$&');

SQLiteへ接続する

connectメソッドを使用してSQLiteに接続するには次のようにします。

my $dbi = DBIx::Custom->connect("dbi:SQLite:dbname=$database", undef, undef, {sqlite_unicode => 1});

第一引数にデータソース名を指定します。第四引数にDBIの属性を指定します。戻り値はDBIx::Customオブジェクトになります。

DBIの属性としてsqlite_unicodeに1を設定しておくと、データベースの文字列を更新・取得するときに、Perlのデコードされた文字列とUTF-8バイト列を自動的に変換してくれるので便利です。

またSQLiteでは試験などを行うときにメモリ上にデータベースを作成できるのが便利です。

my $dbi = DBIx::Custom->connect("dbi:SQLite:dbname=:memory:", undef, undef, {sqlite_unicode => 1});

Oracleへ接続する

connectメソッドを使用してOracleに接続するには次のようにします。

ネットサービス名で接続する場合

Oracleにはネットサービス名で接続する場合は次のような記述になります。

# Connect to Oracle(Net servrice name)
my $dbi = DBIx::Custom->connect("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("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);

データソース名の始まりは「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, 'kimoto', '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("dbi:ODBC:driver=Microsoft Access Driver (*.mdb);dbq=hoge.mdb");

第一引数にデータソース名を指定します。戻り値はDBIx::Customオブジェクトになります。

mdbファイルではjoinがサポートされていない点に注意してください。これはMicrosoft Accessの制限になっています。

Microsoft Access 2007のaccdbファイル

まずこちらから2007用のODBCドライバをインストールする必要があります。

それからdsnを以下のように指定します。上記のmdbファイルを微妙に異なる({}で囲まれている)点に注意してください。

my $dbi = DBIx::Custom->connect("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("dbi:DB2:db_name", $username, $password);

第一引数にデータソース名を指定します。戻り値はDBIx::Customオブジェクトになります。

関連情報