DBIx::Class::Schema::Loader で動的に複数のデータベースにつなぐ方法

DBIx::Class::Schema::Loader を使うとデータベースのスキーマを自動的にモデルに変換してくれます。ここでは、さらに複数のデータベースのスキーマを動的に作成して、マルチベータベースを使うための方法を紹介します。

DBIx::Class::Schema::Loader には make_schema_at というメソッドが用意されているのでこれを使います。

HogeSchema.pm

スキーマローダを継承したクラスです。

package HogeSchema;

use strict;
use warnings;
use base qw/DBIx::Class::Schema::Loader/;

sub make_schema_at {
    return DBIx::Class::Schema::Loader::make_schema_at(@_);
}

1;

test.pl

下の例では taro / hanako / yuko というデータベースに接続します。別のデータベースに接続するときは、disconnect メソッドを呼んでデータベースを切断するのがポイントです。

#!/usr/bin/perl

use strict;
use warnings;
use HogeSchema;

sub do_something {
    my $schema = shift;
    my $model = $schema->resultset('SomeTable')->find(id => 1);
    $model->date_update('now');
    $model->update();
}

foreach (qw/taro hanako yuko/) {
    my $dsn      = "dbi:Pg:dbname=" . $_ . ";";
    my $username = "hogehoge";
    my $password = "fugafuga";

    # データベースのスキーマを読み込みます
    my $schema = HogeSchema::make_schema_at(
        'Hoge::Model::' . $_,
        { relationships => 1 },
        [ $dsn, $username, $password ]
    );

    # データベースに何か操作をします
    &do_something($schema);

    # データベースを切断します
    $schema->storage->disconnect();
}

1;