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

6

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

我认为我不能使用以下方法:

$dbh->{Name}

因为我调用了 USE new_database,所以$dbh->{Name} 只会报告我最初连接的数据库名称。
是否有任何技巧或者我需要跟踪数据库名称呢?

1
你是如何在不知道连接到哪个数据库的情况下连接到数据库的?你必须将其传递给DBI以设置连接... - Brian C. Lane
1
也许是其他模块替他完成了这个任务?也许那个模块动态决定使用哪个数据库?也许他只是好奇? - innaM
5个回答

14

尝试执行查询

select DATABASE();

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


是的,查询有效:my ($dbname) = $dbh->selectrow_array("select DATABASE()"); - Harry

4

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

如果您在连接到数据库句柄后连接到另一个数据库,并且没有设置新的Perl DBI数据库句柄,那么当然,$dbh->{Name}将返回您先前连接的第一个数据库...它不是自动生成的。

因此,要获取已设置数据库句柄后连接的数据库名称-对于DBI mysql:

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

我认为你可能需要 $dbh->{Name},这是 DBI 文档在“数据库句柄属性”部分讨论的内容。此外,DSN 将根据驱动程序甚至用户调用 connect() 方法的方式而发生变化。 - jjohn

1

你可以询问mysql:

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

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


0
当您创建连接对象时,它是针对特定数据库的。至少在DBI的情况下是如此。我不认为执行SQL USE database_name会对您的连接实例产生任何影响。也许连接对象有一个select_db函数(我的DBI已经有点生疏了),或者您将不得不创建一个新的连接到新数据库,以便连接实例能够正确地报告它。

0

FWIW - 可能不是很重要 - DBD::Informix 跟踪当前数据库,如果执行 CREATE DATABASE 等操作,则可以更改该数据库。 $dbh->{Name} 属性按照 DBI 规范在建立句柄时指定使用的名称。因此,有一个特定于 Informix 的属性$dbh->{ix_DatabaseName} ,提供实际当前数据库名称。请参见:perldoc DBD::Informix

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接