如何从Perl MySQL DBI句柄获取数据库名称?

时间:2008-11-21 05:14:52

标签: mysql perl dbi

我使用Perl DBI连接到MySQL数据库。我想找出我连接的数据库。

我认为我不能使用:

$dbh->{Name}

因为我致电USE new_database$dbh->{Name}仅报告我最初连接的数据库。

是否有任何技巧或我是否需要跟踪数据库名称?

5 个答案:

答案 0 :(得分:13)

尝试执行查询

select DATABASE();

根据我的发现,DBH可以访问您最初连接的DSN,但不能在您进行更改后访问。 (可能有更好的方法来切换数据库。)

答案 1 :(得分:2)

$dbh->{Name}从数据库句柄返回数据库名称。

如果在连接到dbh之后连接到另一个db,使用mysql查询“USE db_name”,并且没有设置新的perl DBI db句柄,当然,$ dbh-> {Name}将返回第一个你之前曾联系到......这不是自发的一代。

为了在设置db句柄后获取连接的db名称 - 对于DBI mysql:

sub get_dbname {  
    my ($dbh) = @_;  
    my $connected_db = $dbh->{name};  
    $connected_db =~ s/^dbname=([^;].*);host.*$/$1/;  
    return $connected_db;  
}  

答案 2 :(得分:1)

你可以问mysql:

($dbname) = (each %{$dbh->selectrow_hashref("show tables")}) =~ /^Tables_in_(.*)/;

更新:显然选择DATABASE()是一种更好的方法:)

答案 3 :(得分:0)

创建连接对象时,它适用于某个数据库。无论如何,在DBI的情况下。我不相信做SQL USE database_name会影响你的连接实例。也许连接对象有一个select_db(我的DBI生锈)函数,或者您必须创建一个到新数据库的新连接,以便连接实例正确报告它。

答案 4 :(得分:0)

FWIW - 可能不多 - DBD :: Informix会跟踪当前数据库,如果您执行CREATE DATABASE等操作,这些数据库可能会发生变化。 $dbh->{Name}属性由DBI规范指定为建立句柄时使用的名称。因此,有一个特定于Informix的属性$dbh->{ix_DatabaseName},它提供实际的当前数据库名称。请参阅:perldoc DBD::Informix

您可以考虑请求DBD :: MySQL的维护者添加类似的属性。