2008-11-21 122 views
5

我已经使用Perl DBI连接到MySQL数据库。我想知道我连接到哪个数据库。如何从Perl MySQL DBI句柄获取数据库名称?

我不认为我可以使用:

$dbh->{Name} 

因为我打电话USE new_database$dbh->{Name}只报告我最初连接到数据库。

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

+1

它怎么说,你连接到数据库,但不知道你连接到哪个数据库?你必须将它传递给DBI来建立连接... – 2008-11-21 07:02:02

+1

也许有些其他模块为他做了这个?也许其他模块动态地决定使用哪个数据库?也许他只是好奇? – innaM 2008-11-21 09:59:37

回答

13

尽量只执行查询

select DATABASE(); 

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

+0

是的查询工作: 我($ dbname)= $ dbh-> selectrow_array(“select DATABASE()”); – Harry 2008-11-21 05:44:32

1

你可以问的mysql:

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

更新:明明选择Database()是一个更好的办法来做到这一点:)

+0

现在这是一个很酷的伎俩。 – Harry 2008-11-21 05:40:13

0

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

0

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

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

1

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

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

因此,要获得所连接的数据库名称一旦DB手柄设置 - 为DBI的MySQL:

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