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;