[Cascavel-pm] Verificar se veio dados do banco

Eden Cardim edencardim em gmail.com
Quarta Dezembro 13 11:19:57 PST 2006


On 12/13/06, Gilmar Santos Jr <gilmarjr em dcc.ufba.br> wrote:
> Eden Cardim escreveu:
> > Precisamente, e se usar DBIx::Class, a consulta é trocada
> > automaticamente, de acordo com o contexto.
> >
>
> Uau!
>
> DBIx::Clas+++++++ :)
>
> Não tenho certeza, mas acho que $sth->rows executa a query normalmente,
> armazena os resultados e retorna quantos tem. No caso da DBIx::Class (ou
> se for feito um select count(*) na mão) não há gasto de memória extra
> armazenando-se o resultado.. alguém sabe mais sobre isso? Estou chutando. :)

O DBIx::Class faz lazy population por padrão. Para cada row que você
solicita, é feita uma consulta ao banco e os resultados são guardados
num cache, para que acessos subsequentes não gerem novas consultas (a
não ser que você queira isso, para atualizar o cache, por exemplo).
Isso é o ideal se são selecionadas rows individuais aleatoriamente.
Se você quiser, pode popular o resultset com uma única consulta, o que
é ideal se você sabe, com antecedência, de que vai precisar acessar
todas as rows, isso evita o overhead de executar uma consulta por
acesso.
Existe também uma opção intermediária que são as consultas paginadas.
Sumarizando, você indica quantas rows quer carregar no cache por
consulta e qual a página de resultados quer obter na consulta atual.

A documentação, que, por sinal, é muito boa, explica tudo com mais detalhes

>
> Nesse código:
>
> if($result = $schema->resultset('Teste')) { #select count...
>     $row = $result->next;
>     #fazer algo com a primeira $row
>     $row = $result->next;
>     #fazer algo com a segunda $row
>     #etc...
> }
>
>
>
> No if se faz um select. Mas para o primeiro next, pelo menos, deve haver
> outro. De repente nesse contexto seria interessante fazer logo a query
> no if, pois se não retornar resultados não há diferença entre uma forma
> e outra. Já se retornar fazendo um "select count" obriga a fazer um
> select "normal" depois, ou seja, há 2 consultas ao invés de uma...
>
> A vantagem que vejo nesse método é se a única informação necessária é de
> fato quantos elementos são retornados e não os elementos em si...
>
> Me corrijam se estiver falando besteira :)

Sim, você está perfeitamente correto. O objeto ResultSet é
sobrecarregado para stringificar para o resultado de um "select
count...", o uso do if nesse caso foi apenas para ilustrar a
flexibilidade do DBIC. ;)

-- 
Eden Cardim
Instituto Baiano de Biotecnologia
Núcleo de Biologia Computacional e Gestão de Informações Biotecnológicas
Laboratório de Bioinformática
--
"you seem to think that 'close enough' is close enough...
please learn to be 'literal' around programming."
merlyn - on irc.freenode.net#perl


Mais detalhes sobre a lista de discussão Cascavel-pm