2015-04-28 4 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

Невозможно спамить вверх на ваш комментарий! -> @ 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.

 Смежные вопросы

  • Нет связанных вопросов^_^