我已经使用Perl DBI连接到MySQL数据库。我想知道我连接到哪个数据库。如何从Perl MySQL DBI句柄获取数据库名称?
我不认为我可以使用:
$dbh->{Name}
因为我打电话USE new_database
和$dbh->{Name}
只报告我最初连接到数据库。
是否有任何技巧或我需要跟踪数据库名称?
我已经使用Perl DBI连接到MySQL数据库。我想知道我连接到哪个数据库。如何从Perl MySQL DBI句柄获取数据库名称?
我不认为我可以使用:
$dbh->{Name}
因为我打电话USE new_database
和$dbh->{Name}
只报告我最初连接到数据库。
是否有任何技巧或我需要跟踪数据库名称?
尽量只执行查询
select DATABASE();
从什么我可以发现,DBH可以访问您最初连接的DSN,但不能在完成更改后访问。 (可能有更好的方法来切换数据库。)
是的查询工作: 我($ dbname)= $ dbh-> selectrow_array(“select DATABASE()”); – Harry 2008-11-21 05:44:32
你可以问的mysql:
($dbname) = (each %{$dbh->selectrow_hashref("show tables")}) =~ /^Tables_in_(.*)/;
更新:明明选择Database()是一个更好的办法来做到这一点:)
现在这是一个很酷的伎俩。 – Harry 2008-11-21 05:40:13
当您创建连接对象时,它是针对特定数据库的。无论如何,在DBI的情况下。我不相信SQL USE database_name
会影响你的连接实例。也许有连接对象的select_db(My DBI生锈)函数,或者您必须创建新连接到新数据库以便连接实例正确报告它。
FWIW - 可能不多 - DBD :: Informix会跟踪当前数据库,如果您执行诸如CREATE DATABASE之类的操作,该数据库可能会更改。 $dbh->{Name}
属性由DBI规范指定为句柄建立时使用的名称。因此,有一个特定于Informix的属性$dbh->{ix_DatabaseName}
,它提供了当前的实际数据库名称。参见:perldoc DBD::Informix
。
你可以考虑请求DBD :: MySQL的维护者添加一个类似的属性。
$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;
}
它怎么说,你连接到数据库,但不知道你连接到哪个数据库?你必须将它传递给DBI来建立连接... – 2008-11-21 07:02:02
也许有些其他模块为他做了这个?也许其他模块动态地决定使用哪个数据库?也许他只是好奇? – innaM 2008-11-21 09:59:37