2008-11-21 121 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; 
} 
相關問題