Perl 使用不同密码连接到数据库的多个连接字符串
只是尝试使用不同密码的多个连接字符串连接数据库。密码具有不同的权限。如果一个密码失败,则应尝试使用另一个密码 代码编写如下。虽然它工作得很好,但是我们如何重构代码eval&DBH来处理多个连接字符串呢Perl 使用不同密码连接到数据库的多个连接字符串,perl,dbi,Perl,Dbi,只是尝试使用不同密码的多个连接字符串连接数据库。密码具有不同的权限。如果一个密码失败,则应尝试使用另一个密码 代码编写如下。虽然它工作得很好,但是我们如何重构代码eval&DBH来处理多个连接字符串呢 my %config = do 'dbconfig.pl'; my $dbh = eval { DBI->connect("dbi:Pg:dbname=".$config{db}.";host=$socket_nm;port=".$config{port}."", $config{user
my %config = do 'dbconfig.pl';
my $dbh = eval { DBI->connect("dbi:Pg:dbname=".$config{db}.";host=$socket_nm;port=".$config{port}."", $config{user},$config{password},{RaiseError=>1,PrintError=>0}) };
if (!$dbh) {
$dbh = eval { DBI->connect("dbi:Pg:dbname=".$config{db}.";host=$socket_nm;port=".$config{port}."",$config{user},$config{password},{RaiseError=>1,PrintError=>0}) };
}
if ( $@ ) {
#Handle Exceptions
}
dbconfig.pl包含:
db => 'db',
port => '5432',
user => 'db_ro',
password => 'Pass01',
password2 => 'Pass02'
您需要使用循环并重试,直到您获得一个工作连接。在每个循环中,您需要获取下一组配置值并尝试与之连接
my @configs = (
{
# ...
user => 'user1',
password => 'password1',
},
{
# ...
user => 'user2',
password => 'password2',
},
);
my $dbh;
while ( not $dbh ) {
my $config = shift @configs; # grab the next config
if ( not $config ) {
# we ran out of configs to try
die "Couldn't connect to database";
}
# try the config
$dbh = eval {
DBI->connect(
"dbi:Pg:dbname=" . $config->{db} . ";host=$socket_nm;port=" . $config->{port} . "",
$config->{user}, $config->{password}, { RaiseError => 1, PrintError => 0 } );
};
# we don't need to look at $@ here, but if we care we can still do it
}
配置现在存储在数组@configs中。里面有散列引用。在您的循环中,我们有一个词法$config,其中包含我们要尝试的当前配置。请注意,这也是一个哈希引用,因此您需要在dsn中使用带有箭头的$config->{…}
只要未设置$dbh,就可以循环。直到循环内的eval返回一个工作的数据库句柄对象,情况才会改变
如果配置用完,我们还需要退出循环。死亡似乎是个好主意
如果您愿意,您可以处理eval为您捕获的错误,但要使其正常工作,您不必这样做。如果你所关心的只是你最终得到了一个工作的连接,这就足够了
注意:您的%config=do'dbconfig.pl'非常糟糕。请使用正确的配置文件格式(如JSON)和模块来读取它。我非常喜欢它,因为它支持多种不同的格式,并允许您将多个文件合并到一个配置哈希中。但在这里可能就足够了。多个连接字符串是什么意思?是否要创建多个句柄,每个句柄连接到不同的服务器?服务器是相同的,具有不同权限的密码是不同的。因此,用户和密码是不同的,并且需要多个句柄?请指定输出内容。如果无法连接第一个连接字符串,则应尝试第二个连接字符串并捕获错误(如果有)。