我已經使用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