Perl Rose::DB非静态数据源注册



我正在编写一个perl应用程序,它使用Rose::DB进行持久化抽象,但是我遇到了一个问题,用配置文件中的值初始化Rose::DB子类。

文档总是提供硬编码的示例,如:

# Register your lone data source using the default type and domain
__PACKAGE__->register_db(
  driver   => 'pg',
  database => 'my_db',
  host     => 'localhost',
  username => 'joeuser',
  password => 'mysecret',
);

但是,为了可维护性,我想在运行时从单独的配置文件中填充这些值。

正在使用的配置文件(config::General format)部分:

<database> 
    active_domain       development
    <db_domain development>
        db_driver       mysql
        db_name         stats_dev
        db_host         localhost
        db_user         stats_dev
        db_password     stats_dev
    </db_domain>
    <db_domain production>
        db_driver       mysql
        db_name         stats_prd
        db_host         localhost
        db_user         stats_prd
        db_password     stats_prd
    </db_domain>
</database>

My Rose::DB子类,带初始化方法:

package Utils::DBUtils;
use strict;
use base qw(Rose::DB);
__PACKAGE__->use_private_registry;
sub registerAllDBs {
    my ($self,$config_obj) = @_;
    my $db_config = $config_obj->getDatabaseSection(); ## subconfig starts here
    my $def_domain = $db_config->{"active_domain"};
    __PACKAGE__->default_domain($def_domain);
    __PACKAGE__->default_type('main');
    my $db_domains = $db_config->{'db_domain'};
    foreach my $domain (keys %$db_domains) {
        my $domain_conf = $db_domains->{$domain};
        __PACKAGE__->register_db(
            domain => $domain,
            type => __PACKAGE__->default_type(),
            driver   => $domain_conf->{'db_driver'},
            database => $domain_conf->{'db_name'},
            host     => $domain_conf->{'db_host'},
            username => $domain_conf->{'db_user'},
            password => $domain_conf->{'db_password'}
        );          
    }
}
1;

然后在我的主脚本中,我调用该方法一次注册所有数据源:

    Utils::DBUtils->registerAllDBs($conf);

我的持久化对象都继承自PersistentObject包,它用以下方式初始化DB对象:

    sub init_db { Utils::DBUtils->new() }

然而,这并不像我预期的那样工作。我得到一个编译时错误声明:

    No database information found for domain 'default' and type 'default' and no driver type specified in call to Utils::DBUtils->new(...) at PersistentObject.pm line 9

问题似乎是Rose::DB期望在编译时拥有完整的配置数据,由于它来自配置文件,因此不可能提供。

我错过了什么吗?是不是可以动态初始化Rose::DB对象?

我已经设法让它工作,似乎Rose::DB子类在编译时至少需要一个register_db语句。

(丑陋的)解决方案是添加

__PACKAGE__->register_db(
  driver   => 'mysql',
  database => 'fake',
  host     => 'localhost',
  username => 'fake',
  password => 'fake'
);

相关内容

  • 没有找到相关文章

最新更新