2015-04-28 48 views
0

鑑於這種perl的DBI查詢:獲取列名的索引號用Perl DBI

$qh = $db_connection->prepare ('SELECT addresses.* from addresses WHERE 1'); 

的地址表結構可能會在未來改變,那就是,一些新的列可能會插入到它。因此,不能保證特定列可能分配給哪個索引編號。

當我做了一個$qh->fetchrow_array,我想能夠確定什麼是特定列的索引號,所以我可以檢查它是否爲空。例如,我想看看是否mail_addr欄是空的,像這樣:

if (!$$row[$index_number]) { 
    do_something(); 
} 

如何確定價值$index_number應該是什麼?

+0

http://perlmaven.com/simple-database-access-using-perl-dbi-and-sql –

+6

這就是爲什麼你不應該使用'SELECT *'。指定您想要在SQL語句中返回的列。否則就會冒險破壞你的代碼,正如你已經想到的那樣。 – ThisSuitIsBlackNot

+0

無法發送垃圾郵件您的評論uparrow! - > @ ThisSuitIsBlackNot – Axeman

回答

3

這可以通過$sth->{NAME}確定。然而,這種情況可能是fetchrow_hashref更合適,它實現你要找的索引字段名的所有膠:

while (my $row = $qh->fetchrow_hashref) { 
    if (!$row->{mail_addr}) { 
    do_something(); 
    } 
} 

還要考慮FetchHashKeyName屬性,fetchrow_hashref('NAME_lc')$sth->{NAME_lc}屬性,這將保證由DBI提交的字段名稱。不同的SQL引擎將對標識符大小寫進行不同的標準化處理,通常取決於標識符在聲明時是否被引用。

1

首先,請不要使用$$row[$index_number]語法。任何看着你的代碼的人都會期待看到寫作爲$row->[$index_number]

你已經弄清楚爲什麼SELECT *是一個壞主意。所以不要這樣做。列出您感興趣的特定列 - 這樣您可以施加您自己的訂單(fetchrow_array按列出現在SELECT子句中的順序返回列)。

或者,切換到其中一個基於散列的提取方法,如fetchrow_hashref

但最好的選擇是看看使用DBIx::Class