5

我已经使用 Perl DBI 连接到 MySQL 数据库。我想知道我连接到哪个数据库。

我不认为我可以使用:

$dbh->{Name}

因为我调用USE new_database并且$dbh->{Name}只报告我最初连接的数据库。

有什么技巧还是我需要跟踪数据库名称?

4

5 回答 5

13

尝试只执行查询

select DATABASE();

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

于 2008-11-21T05:37:41.493 回答
3

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

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

因此,一旦设置了数据库句柄,就获取连接的数据库名称 - 对于 DBI mysql:

sub get_dbname {  
    my ($dbh) = @_;  
    my $connected_db = $dbh->{name};  
    $connected_db =~ s/^dbname=([^;].*);host.*$/$1/;  
    return $connected_db;  
}  
于 2011-01-08T14:10:54.957 回答
1

你可以问mysql:

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

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

于 2008-11-21T05:35:21.890 回答
0

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

于 2008-11-21T05:40:08.090 回答
0

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

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

于 2008-11-21T07:25:04.413 回答