2010-02-18 8 views

Respuesta

3

Puede usar Moose con DBIC sin problemas. De hecho, me gusta utilizar MooseX :: Declarar ya que encuentro la sintaxis extendida es muy útil en el diseño de API públicas sólidas, por ejemplo:

use MooseX::Declare; 
class MyApp::Schema::Result::Geo::Division 
extends MyApp::Schema::Result { 
    use Locale::Geocode::Division; 
__PACKAGE__->table('division'); 
__PACKAGE__->add_columns(
    fk_territory_id => { 
    data_type => 'char', 
    size => '36', 
    }, 
    division_id => { 
    data_type => 'char', 
    size => '36', 
    }, 
    code => { 
      data_type => 'varchar', 
    size => '5', 
    }, 
    created => { 
    data_type => 'datetime', 
    set_on_create => 1, 
    }, 
); 

__PACKAGE__->set_primary_key('fk_territory_id','division_id'); 
__PACKAGE__->uuid_columns('division_id'); 
    __PACKAGE__->add_unique_constraint(['fk_territory_id','code']); 

__PACKAGE__->belongs_to(
    territory => 'MyApp::Schema::Result::Geo::Territory', 
    {'foreign.territory_id' => 'self.fk_territory_id'}, 
); 
    method as_geocode_division { 
     Locale::Geocode::Division->new($self->code); 
    }  
__PACKAGE__->meta->make_immutable(inline_constructor => 0); 
} 1; 
+0

¿Cómo declararía los atributos Moose si el esquema ya está definido por el DB (es decir, las lecturas DBIx :: Class en el esquema, en lugar de estar definido por las llamadas al método que hace arriba)? – Ether

+0

¿Quiere decir cargar el esquema * runtime *? No voy a jugar bien. :) – hobbs

1

Parece que usted está describiendo exactamente lo que escribí recientemente con el fin de mapear los alces los valores de atributo en Rose::DB::Object valores (con el objeto db y el administrador de objetos contenidos en los atributos privados) y viceversa. Originalmente usé activadores alrededor de cada atributo de Moose para escribir en el objeto Rose de inmediato, pero más tarde abandoné ese enfoque y escribí los valores perezosos solo cuando fue necesario (es decir, en el momento de una operación ->save()). Lo implementé usando algunos roles y una clase de azúcar que instaló automáticamente un rasgo de atributo que indica "Soy un campo de tabla" para los atributos relevantes.

Pero no hagas lo que hice, solo usa DBIx::Class directamente. La siguiente versión principal está siendo reescrita en Moose de todos modos, así lo escucho.

+0

* La siguiente versión principal está siendo reescrita en Moose de todos modos, por lo que oigo. * Que ha estado dando vueltas durante años. –

+1

Matt tuvo una charla ingeniosa sobre ello en Perl Oasis el mes pasado. – perigrin

6

Si tiene que mapear entre las clases de Moose y un esquema de DBIC, le recomendamos que consulte un almacén de objetos persistentes como KiokuDB.

Pierdes algunas de las funciones de una Base de Datos Relacional, especialmente si tienes un esquema existente pero obtienes muchas características, la principal es la asignación silenciosa entre el data-store y tu modelo de Objetos. El back-end de DBI para KiokuDB es probablemente el mejor ejemplo de esta compensación. La base de datos está altamente des-normalizada, pero eso se debe a que está funcionando tan efectivamente como un almacén de claves.

KiokuDB, sin embargo, puede funcionar con motores de almacenamiento optimizados para este tipo de datos. Es compatible con varias de las celebridades actuales de "NoSQL", incluidas CouchDB y MongoDB. También es compatible con BerkelyDB, el favorito de los antiguos seguidores.

Kioku no es la respuesta para cada problema, pero se usa con bastante éxito para Parking Mobility para manejar todo el almacenamiento de datos sin problemas.

+0

+1 por convencerme de la mención de KiokuDB. –

Cuestiones relacionadas