Использование fetchrow_hashref для хранения данных - PullRequest
4 голосов
/ 21 декабря 2011

Я пытаюсь извлечь информацию из базы данных MySQL, которой затем буду манипулировать в perl:

use strict;
use DBI;

my $dbh_m= DBI->connect("dbi:mysql:Populationdb","root","LisaUni") 
or die("Error: $DBI::errstr");

my $Genotype = 'Genotype'.1;
#The idea here is eventually I will ask the database how many Genotypes there are, and then loop it round to complete the following for each Genotype:

my $sql =qq(SELECT TransNo, gene.Gene FROM gene JOIN genotypegene ON gene.Gene =       genotypegene.Gene WHERE Genotype like '$Genotype');
my $sth = $dbh_m-> prepare($sql);
$sth->execute;

my %hash;

my $transvalues = $sth->fetchrow_hashref;
my %hash= %$transvalues;

$sth ->finish();
$dbh_m->disconnect();       

my $key;
my $value;

while (($key, $value) = each(%hash)){
 print $key.", ".$value\n; }

Этот код не выдает никаких ошибок, но хеш% хранит только последнюю строку, взятую из базы данных (у меня появилась идея написать ее таким образом с с этого сайта ). Если я наберу:

while(my $transvalues = $sth->fetchrow_hashref){
print "Gene: $transvalues->{Gene}\n";
print "Trans: $transvalues->{TransNo}\n";
}

Затем он распечатывает все строки, но мне нужно, чтобы вся эта информация была доступна после того, как я закрыл соединение с базой данных.

У меня также есть связанный вопрос: в моей базе данных MySQL строка состоит, например, из 'Gene1' (Gene), '4' (TransNo). Как только я заберу эти данные из базы данных, как я делаю выше, TransNo все еще будет знать, с каким геном он связан? Или мне нужно для этого создать какую-то хеш-структуру хеша?

1 Ответ

6 голосов
/ 21 декабря 2011

Вы вызываете «неправильную» функцию.

fetchrow_hashref вернет одну строку в качестве хэш-функции, вы должны обернуть ее использование внутри цикла, завершив ее, когда fetchrow_hashref вернетundef.

Похоже, вы ищете fetchall_hashref, который даст вам все возвращенные строки в виде хэша с указанным первым параметромкакое поле использовать в качестве ключа.

$hash_ref = $sth->fetchall_hashref ($key_field);

Каждая строка будет вставлена ​​в $hash_ref как внутренний хэш-адрес, используя $key_field в качестве ключа, в котором вы можете найти строку в $hash_ref.

Что говорится в документации?

Метод fetchall_hashref может использоваться для извлечения всех данных, которые должны быть возвращены из подготовленного и выполненного дескриптора оператора.

Itвозвращает ссылку на хеш, содержащий ключ для каждого отдельного значения столбца $ key_field, который был выбран.

Для каждого ключа соответствующее значение является ссылкой на хеш, содержащий все выбранные столбцы и их значения, каквозвращается fetchrow_hashref ().


Ссылки на документацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...