Perl 使用不同密码连接到数据库的多个连接字符串

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

只是尝试使用不同密码的多个连接字符串连接数据库。密码具有不同的权限。如果一个密码失败,则应尝试使用另一个密码

代码编写如下。虽然它工作得很好,但是我们如何重构代码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},$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)和模块来读取它。我非常喜欢它,因为它支持多种不同的格式,并允许您将多个文件合并到一个配置哈希中。但在这里可能就足够了。

多个连接字符串是什么意思?是否要创建多个句柄,每个句柄连接到不同的服务器?服务器是相同的,具有不同权限的密码是不同的。因此,用户和密码是不同的,并且需要多个句柄?请指定输出内容。如果无法连接第一个连接字符串,则应尝试第二个连接字符串并捕获错误(如果有)。