DBIx::Class

All your databases are belong to us
Conceptos
• ORM
 – Object-Relational Mapper
Mundo Relacional <-> Mundo OO
• Tabla: Un conjunto de     • Clase: Define los datos
  elementos con las           (propiedades) y
  mismas propiedades,         métodos que tendrá un
  identificados por una       objeto
  clave.                    • Objeto: Instancia de
• Fila: un elemento único     una clase.
  del conjunto
Mundo Relacional <-> Mundo OO
• Tabla: Un conjunto de     • Clase: Define los datos
  elementos con las           (propiedades) y
  mismas propiedades,         métodos que tendrá un
  identificados por una       objeto
  clave.                    • Objeto: Instancia de
• Fila: un elemento único     una clase.
  del conjunto
Definiciones
DBIx::Class no es DBIx
• ResultSet: Conjunto de Rows
• ResultSource: Definición de un ResultSet
• Row: Un objeto que representa una fila
• Schema: Una base de datos
ResultSet
        $schema->resultset(‘Users’)



Users
ResultSet
  $schema->resultset(‘Users’)->search(, ‘id’ => , ‘>’ => 7 - -)



Users
ResultSet
        $schema->resultset(‘Users’)->search(, ‘id’ => 8 -)



Users
Iterando un Resultset
my $rs = $schema->resultset(“Users”)-
  >search(…)
while (my $row = $rs->next){
  say $row->FirstName
}
Iterando un Resultset
while (my $row = $schema->resultset(“Users”)-
  >next){
  say $row->FirstName
}

Bucle infinito!!!
SQL::Abstract
• Modulo independiente
   – Mantenido por los autores de DBIx::Class
• Convierte estructuras de datos en consultas
campo => 6
campo => , ‘>=‘ => 7 -
campo => , ‘LIKE’ => ‘K%’ -
campo => [ 6,7,8 ]
-or => [ { campo1 => 6 }, { campo2 => 7 } ]
-and => [ { cond1 }, { cond2 }, { cond3 } ]
campo => { -in => [ 2,5,6 ] }
campo => { -between => [1, 6] }
campo => undef
SQL::Abstract
• Más potencia escondida en el segundo parámetro de search
, ‘select’ => * ‘name’, ’TO_LOWER(surname)’ +
  ‘as’ => * ‘name’, ‘lower_surname’ +
  ‘order_by’ => ‘name’
}

{ join => ‘relation_name’
  prefetch => ‘relation_name’
}

, ‘select’ => * ‘name’, , ‘COUNT’ => ‘id’ - +
  ‘as’ => * ‘name’, ‘count’ +,
   group_by => * ‘name’ +
}
metodos *_rs
• En contexto de lista search devuelve una lista
  de rows
• search_rs fuerza devolver un resultset
  – En Template::Toolkit todo se evalua en contexto
    de lista 
foreach my $row ($rs->search({})){
  say $row->FirstName
}
Chaining de ResultSets
$rs = $rs->search(, “age” => , “>=“ => 40 - -);
$rs = $rs->search(, “name” => , “LIKE” => “J%” -
  });
….

my $obj = $rs->first;
Find
$row = $rs->find(, “id” => 3 -);

__PACKAGE__->add_unique_constraint(
  “dni” => * ‘dni’ +
  );
$row = $rs->find( , ‘dni’ => ‘XXX’ -, , ‘key’ => ‘dni’
  });
Insert, Update, Delete
•   Insert
     –   $o = $rs->resultset(‘Users’)->create
     –   $o->FirstName(“Val1”);
     –   $o->SurName(“Val2”);
     –   $o->insert;
•   Update
     – $o = $rs->find(, ‘id’ => 8 -);
     – $o->FirstName(“Little Bobby”);
     – $o->update

     – $rs->search(, ‘age’ => ’0’ -)->update(, ‘age’ => 1 -);
     – $rs->search(, ‘age’ => ’0’ -)->update_all(, ‘age’ => 1 -);

•   Delete
     – $o = $rs->find(, ‘id’ => 8 -);
     – $o->delete

     – $rs->search(, ‘age’ => ’0’ -)->delete;
     – ->search(, ‘age’ => ’0’ -)->delete_all;
Plugins útiles
• DBIx::Class::InflateColumn::
  – DateTime
  – Serializer
  – Object::Enum
  – Path::Class
  – IP
  – File
  – ….
• DBIx::Class::Tree
Referencia
• DBIx::Class::Manual::Cookbook
• DBIx::Class::Manual::FAQ
Ejercicio
User




                   Event




Role
Ejercicio(s)
git clone
    https://github.com/diegok/dbic.curs.barcelona.pm.git
Inicializar base de datos
    prove -lv t/*
   - que pase los tests
Script que popula una base de datos
 - 3 usuarios
 - 5 eventos
 - apunta a 2 usuarios a 4 eventos
Script que saca un listado de:
    - Los usuarios
    - Los eventos a los que no van a asistir usuarios

DBIx::Class

  • 1.
  • 2.
    Conceptos • ORM –Object-Relational Mapper
  • 3.
    Mundo Relacional <->Mundo OO • Tabla: Un conjunto de • Clase: Define los datos elementos con las (propiedades) y mismas propiedades, métodos que tendrá un identificados por una objeto clave. • Objeto: Instancia de • Fila: un elemento único una clase. del conjunto
  • 4.
    Mundo Relacional <->Mundo OO • Tabla: Un conjunto de • Clase: Define los datos elementos con las (propiedades) y mismas propiedades, métodos que tendrá un identificados por una objeto clave. • Objeto: Instancia de • Fila: un elemento único una clase. del conjunto
  • 5.
    Definiciones DBIx::Class no esDBIx • ResultSet: Conjunto de Rows • ResultSource: Definición de un ResultSet • Row: Un objeto que representa una fila • Schema: Una base de datos
  • 6.
    ResultSet $schema->resultset(‘Users’) Users
  • 7.
    ResultSet $schema->resultset(‘Users’)->search(,‘id’ => , ‘>’ => 7 - -) Users
  • 8.
    ResultSet $schema->resultset(‘Users’)->search(, ‘id’ => 8 -) Users
  • 9.
    Iterando un Resultset my$rs = $schema->resultset(“Users”)- >search(…) while (my $row = $rs->next){ say $row->FirstName }
  • 10.
    Iterando un Resultset while(my $row = $schema->resultset(“Users”)- >next){ say $row->FirstName } Bucle infinito!!!
  • 11.
    SQL::Abstract • Modulo independiente – Mantenido por los autores de DBIx::Class • Convierte estructuras de datos en consultas campo => 6 campo => , ‘>=‘ => 7 - campo => , ‘LIKE’ => ‘K%’ - campo => [ 6,7,8 ] -or => [ { campo1 => 6 }, { campo2 => 7 } ] -and => [ { cond1 }, { cond2 }, { cond3 } ] campo => { -in => [ 2,5,6 ] } campo => { -between => [1, 6] } campo => undef
  • 12.
    SQL::Abstract • Más potenciaescondida en el segundo parámetro de search , ‘select’ => * ‘name’, ’TO_LOWER(surname)’ + ‘as’ => * ‘name’, ‘lower_surname’ + ‘order_by’ => ‘name’ } { join => ‘relation_name’ prefetch => ‘relation_name’ } , ‘select’ => * ‘name’, , ‘COUNT’ => ‘id’ - + ‘as’ => * ‘name’, ‘count’ +, group_by => * ‘name’ + }
  • 13.
    metodos *_rs • Encontexto de lista search devuelve una lista de rows • search_rs fuerza devolver un resultset – En Template::Toolkit todo se evalua en contexto de lista  foreach my $row ($rs->search({})){ say $row->FirstName }
  • 14.
    Chaining de ResultSets $rs= $rs->search(, “age” => , “>=“ => 40 - -); $rs = $rs->search(, “name” => , “LIKE” => “J%” - }); …. my $obj = $rs->first;
  • 15.
    Find $row = $rs->find(,“id” => 3 -); __PACKAGE__->add_unique_constraint( “dni” => * ‘dni’ + ); $row = $rs->find( , ‘dni’ => ‘XXX’ -, , ‘key’ => ‘dni’ });
  • 16.
    Insert, Update, Delete • Insert – $o = $rs->resultset(‘Users’)->create – $o->FirstName(“Val1”); – $o->SurName(“Val2”); – $o->insert; • Update – $o = $rs->find(, ‘id’ => 8 -); – $o->FirstName(“Little Bobby”); – $o->update – $rs->search(, ‘age’ => ’0’ -)->update(, ‘age’ => 1 -); – $rs->search(, ‘age’ => ’0’ -)->update_all(, ‘age’ => 1 -); • Delete – $o = $rs->find(, ‘id’ => 8 -); – $o->delete – $rs->search(, ‘age’ => ’0’ -)->delete; – ->search(, ‘age’ => ’0’ -)->delete_all;
  • 17.
    Plugins útiles • DBIx::Class::InflateColumn:: – DateTime – Serializer – Object::Enum – Path::Class – IP – File – …. • DBIx::Class::Tree
  • 18.
  • 19.
    Ejercicio User Event Role
  • 20.
    Ejercicio(s) git clone https://github.com/diegok/dbic.curs.barcelona.pm.git Inicializar base de datos prove -lv t/* - que pase los tests Script que popula una base de datos - 3 usuarios - 5 eventos - apunta a 2 usuarios a 4 eventos Script que saca un listado de: - Los usuarios - Los eventos a los que no van a asistir usuarios