【问题标题】:Get the index number of a column name with Perl DBI使用 Perl DBI 获取列名的索引号
【发布时间】:2015-04-28 20:02:57
【问题描述】:

鉴于这个 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 的值应该是多少?

【问题讨论】:

  • 这就是为什么你不应该使用SELECT *。指定要在 SQL 语句中返回的列。正如您已经发现的那样,否则这样做可能会破坏您的代码。
  • 不能在您的评论中发送垃圾邮件! ->@ThisSuitIsBlackNot
  • 如果mail_addr 列不再存在,您想做什么?
  • 您可以为此使用NAME_lc_hash 属性。但是 fetchrow_hashref (建议在下面的答案中)或bind_columns 几乎总是一个更好的选择。请参阅绑定到哈希字段的 bind_columns 示例。

标签: perl dbi


【解决方案1】:

这可以通过$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 引擎会以不同的方式规范标识符大小写,通常取决于声明时标识符是否被引用。

【讨论】:

    【解决方案2】:

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

    您已经知道为什么SELECT * 是个坏主意。所以不要那样做。列出您感兴趣的特定列 - 这样您就可以强加自己的顺序(fetchrow_array 按列在 SELECT 子句中出现的顺序返回列)。

    或者,切换到基于哈希的获取方法之一,例如fetchrow_hashref。

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

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 2014-02-09
      • 2023-04-10
      • 2011-08-22
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      相关资源
      最近更新 更多