使用Perl DBI获取列名的索引号

时间:2015-04-28 20:02:57

标签: 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应该是什么?

2 个答案:

答案 0 :(得分: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 :(得分:1)

首先,请不要使用$$row[$index_number]语法。任何查看代码的人都希望看到代码为$row->[$index_number]

你已经弄清楚为什么SELECT *是一个坏主意。所以不要这样做。列出您感兴趣的特定列 - 这样您就可以强制执行自己的订单(fetchrow_array按照它们在SELECT子句中出现的顺序返回列。)

或者,切换到其中一个基于散列的提取方法,如fetchrow_hashref

但最好的选择是使用DBIx::Class