Параметр атрибута ошибки отсутствует в хеш-ссылке при использовании Perl DBI selectall_hashref

Я пытаюсь заставить свой первый выбор работать с использованием selectall_hashref из модуля Perl DBI. Я успешно установил соединение с базой данных (MySQL). Я получаю сообщение об ошибке, когда выполняю следующее:

$dbh->selectall_hashref('SELECT id FROM users WHERE login=?',undef,"myusername");

DBI :: st = HASH (0x1505a60) -> _ prepare (...): параметр атрибута 'myusername' не является хеш-ссылкой в ​​строке /usr/lib/x86_64-linux-gnu/perl5/5.20/DBD/mysql.pm 238.

Моя таблица должна поддерживать этот запрос, в ней есть столбец id и столбец login для каждого пользователя.

Примеры, которые я нашел для selectall_hashref, показывают, что параметр подстановки ? передается как третий параметр. В документации DBI говорится, что второй и третий аргументы должны быть %attr и @bind_values, но не содержит подробной документации по ним и не показывает рабочие примеры.

Что вызывает ошибку и, что более важно, как вы на самом деле правильно используете %attr и @bind_values?


person Stephen Ostermiller    schedule 13.02.2016    source источник


Ответы (2)


Если вы хотите сохранить все как ссылку на массив, где каждая строка представляет собой хэш-ссылку (это то, что ваш кажется, что комментарий указывает), вы можете использовать метод selectall_arrayref() с атрибутом Slice:

$dbh->selectall_arrayref('SELECT id FROM users WHERE login=?', {Slice => {}}, 'myusername');

Это немного странно, но вот как это работает:

Если $ slice является хеш-ссылкой, fetchall_arrayref выбирает каждую строку как хеш-ссылку. Если хэш $ slice пуст, то ключи в хешах имеют тот регистр имени, который возвращается по умолчанию. (См. Атрибут «FetchHashKeyName».) Если хеш $ slice равен не empty, то он используется как фрагмент для выбора отдельных столбцов по имени. Значения хэша должны быть установлены равными 1. Имена ключей возвращаемых хэшей соответствуют регистру букв имен в хеш-параметре, независимо от "FetchHashKeyName".

Рекомендуется установить атрибут FetchHashKeyName в дескрипторе базы данных, чтобы имена хеш-ключей согласовывались; Мне нравится NAME_lc в моих приложениях.

person Matt Jacob    schedule 13.02.2016

Методы ожидают ключевой столбец как второй параметр, а атрибут ref передается как третий. В результате он строит хеш с указанным столбцом в качестве ключа. Вы, вероятно, захотите selectall_arrayref:

$ dbh->selectall_arrayref('SELECT id FROM users WHERE login=?',undef,"myusername");
person Zbynek Vyskovsky - kvr000    schedule 13.02.2016
comment
Я надеялся получить хэш-ссылку типа {"id"->1}, поэтому я выбрал версию хеш-ссылки. Относится ли hashref к параметрам, которые он принимает, а не к тому, что он возвращает? - person Stephen Ostermiller; 13.02.2016
comment
Понятно. Боюсь, вам нужно идти строка за строкой и использовать для этого fetchrow_hashref. DBI немного непоследователен в отношении именования ... - person Zbynek Vyskovsky - kvr000; 13.02.2016
comment
Вот и все. Я хотел selectrow_hashref, а не selectall_hashref. Я видел примеры для обоих и скопировал неправильный код. - person Stephen Ostermiller; 13.02.2016
comment
@StephenOstermiller Вы можете использовать selectall_arrayref() для получения всего в виде ссылки на массив хэш-ссылок. - person Matt Jacob; 13.02.2016
comment
Схема именования - selectX_Yref, где X - это row, col или all, а Y - это либо array, либо hash. Массив или хэш ссылается на самую внешнюю ссылку, то есть на ссылку, возвращаемую методом, контейнером для строк. Параметр атрибута управляет тем, что внутри самой внешней ссылки. - person Tim Bunce; 14.02.2016