[Cascavel-pm] mapeamento objeto-relacional

Nilson Santos Figueiredo Junior acid06 em gmail.com
Sexta Abril 28 07:30:52 PDT 2006


On 4/28/06, Solli Honorio <shonorio em gmail.com> wrote:
> E a questão de performance ?

Teste e veja se te atende, obviamente é mais lento que o DBI normal.
Mas em compensação você tem algo que vai ser completamente
database-agnostic sem nem uma linha de SQL.

O projeto que eu tinha começado realmente provia performance melhor,
mas não tinha um décimo dos recursos. E a performance dele só era
melhor por que eu abria múltiplas conexões ao banco de dados e fazia
caching dos resultados. O DBIx::Class tem caching interno agora e a
abertura de múltiplas conexões já me deu vários problemas no projeto
em que eu o utilizei por estouro da quantidade de conexões (o meu
projeto abria 1 conexão por tabela, com 3 clientes simultâneos o
limite do MySQL estava estourando).

O DBIx::Class é atualmente o melhor mapeador objeto-relacional pra
Perl (e eu até ouso dizer que ele é realmente o melhor de todos, de
todas as linguagens). Ele é ativamente desenvolvido e cada vez melhora
mais.

Atualmente eu comecei a desenvolver um novo método de declarar classes
para o DBIx::Class, baseado numa sintaxe declarativa. Eu fui bastante
adiante, mas fiquei atolado, sem tempo e não vou poder terminá-lo por
agora. Mas já está num estado perfeitamente utilizável e disponível no
repostiório SVN do DBIx::Class (
http://dev.catalyst.perl.org/repos/bast/branches/Moose-Style-Schema-Declare/
).

A idéia é declarar suas tabelas com uma sintaxe da seguinte maneira:

package MyDB::Schema;
use DBIx::Class::Schema::Declare;

schema_version '2', as {

  class 'Usuário', as {
    has id => AutoId();
    has nome => String(64), Unique();
    has idade => Integer();
    has cidade => Object('Cidade');
  };

  class 'Cidade', as {
    has id => AutoId();
    has nome => String(32);
  };

}

Esse código acima é código Perl perfeitamente válido. Com base nele o
DBIx::Class::Schema::Declare cria as classes e faz os reclacionamentos
entre as classes automaticamente. Na verdade, salvo engano, o exemplo
acima funciona perfeitamente com a versão atual do
DBIx::Class::Schema::Declare, pode testar.

O conceito de schemas do DBIx::Class é muito legal. E, com base no
código acima, depois você poderia chamar um MyDB::Schema->deploy() em
um script de preparação de ambiente em que ele criaria todas as
tabelas. Outra coisa é você poder ter várias versões diferentes de
schemas e quando fizesse atualização da versão de um aplicativo, ele
geraria também todo o código dos "ALTER TABLE"s etc.

Eu nem consigo imaginar como é programar hoje em dia sem isso, só de
ver umas linhas de SQL no meio do código já tenho uma leve sensação de
asco. ;-)

-Nilson Santos F. Jr.


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