我正在编写一个使用 Rose::DB 进行持久性抽象的 perl 应用程序,但是在使用配置文件中的值初始化我的 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 格式)部分:
<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>
我的 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 对象吗?