User Tools

Site Tools


perl:dbic

View page as slide show

DBIx::Class

Pequena introdução, muito vai ficar por dizer.

Introdução

  • ORM (Object Relation Mapper), “relaciona objectos com tabelas”
  • Aceder aos dados com chamadas sobre objectos
  • Criar o schema
    • manualmente, ver exemplo na documentação
    • a partir de uma base de dados
  • Vantagens:
    • não precisamos escrever SQL
    • independente do motor de base de dados
    • lazy evaluation”, não efectua operações até ser estritamente necessário

Criação o modelo de dados

Vamos criar o schema a partir de uma base de dados. O seguinte código SQL cria uma tabela:

CREATE TABLE book (
    id          INTEGER PRIMARY KEY,
    title       TEXT,
    rating      INTEGER
  );

Criar a base de dados em sqlite:

$ sqlite3 books.db < books.sql

Gerar o schema

Utilizando a base de dados que criamos anteriormente:

$ dbicdump -o dump_directory=./lib My::Schema 'dbi:SQLite:books.db'

E são gerados os seguintes ficheiros:

$ find lib/
lib/My
lib/My/Schema.pm
lib/My/Schema
lib/My/Schema/Result
lib/My/Schema/Result/Book.pm

Criação de registos

Primeiro é necessário carregar o schema criado e estabelecer uma ligação à base de dados:

use My::Schema;
 
my $schema = My::Schema->connect('dbi:SQLite:books.db');

Podemos depois criar um novo registo com a função create, por exemplo:

$schema->resultset('Book')->create({
                title => 'Learning Perl',
                rating => 10,
            });

Na base de dados

Usar o sqlite para consultar a base de dados:

$ sqlite3 books.db

Podemos ver o registo que foi criado anteriormente:

sqlite> select * from book;
1|Learning Perl|10

Listar registos

Para listar todos os livros podemos aceder a todos os elementos dessa entidade usando a função all:

my @list = $schema->resultset('Book')->all;

É simples agora imprimir a lista de todos os livros, ou efectuar qualquer outro tipo de processamento. Para aceder às colunas temos funções com o mesmo nome que devolvem o valor, por exemplo title:

foreach (@list) {
    print "Id: ", $_->id, " Título: ", $_->title, "\n";
}

Listar registos, exemplo

O resultado de correr o script anterior seria algo do estilo:

$ perl -Ilib books_list.pl
Id: 1 Título: Learning Perl
Id: 2 Título: Perl Hackers
Id: 3 Título: Beginning Perl

De notar o -Ilib uma vez que os ficheiros que implementam o nosso schema estão na directoria lib/.

Aceder a um registo directamente

Podemos aceder directamente a um registo através da função find, por exemplo para aceder directamente ao

my $book = $schema->resultset('Book')->find(1);

Podemos depois usar as funções do objecto para aceder aos respectivos valores como anteriormente:

print "Título: ", $book->title, "\n";

Actualizar um registo

Podemos ainda usar estar funções para actualizar os valores dos registos passando o novo valor como parâmetro:

$book->title('Learning Perl, 2nd Edition');

Uma vez que o DBIC é lazy os dados foram apenas alterados no objecto, para realmente actualizar os dados na base de dados chamamos a funcção update desse objecto:

$book->update;

Outros tópicos

  • relações entre entidades
  • queries mais complexas
  • join de tabelas
  • procura de registos
    • procuras encadeadas
  • atalhos interessantes

Conclusão

  • No início
    1. criar o modelo de dados
    2. gerar o schema
  • Depois
    1. carregar o schema
    2. usar os métodos dos objectos
  • Não escrever mais SQL
  • Muito mais para dizer ainda…
perl/dbic.txt · Last modified: 2010/11/16 22:10 by smash