http://www.perlmonks.org?node_id=557438


in reply to Re^2: Class::DBI vs. DBIx::Class
in thread Class::DBI vs. DBIx::Class

On the other hand, this comes at the price of longer code for simple tasks, e.g., for inserting into a table 'Person', one would use
# using DBIx::Class: $schema->resultset('Person')->new({FirstName=>'Joe'})->insert(); # using Class::DBI: DB::Person->insert({FirstName=>'Joe'});

How about:

$schema->resultset('Person')->create({ FirstName => 'Joe' });

If you don't want to get the resultset from the schema first, you'll need to use DBIx::Class (DBIC) without a schema, which is usually called CDBI plain, but you'll then loose the advantages of the composable schemas, which, for example, allow you to connect to multiple databases from the same set of classes. I think using schemas is usually worth the overhead.

I don't really know how to solve your problem with the posted snippet, but I suspect it's caused by the load_classes call. You can probably work that around with using register_class or register_source, but I haven't really looked into that as I don't like to ram up a single .pm file with several modules.

Cheers, Flo

Replies are listed 'Best First'.
Re^4: Class::DBI vs. DBIx::Class
by hrr (Monk) on Jun 25, 2006 at 16:08 UTC
    Thank you very much! register_class works well:
    package DB; map { __PACKAGE__->register_class($_, __PACKAGE__ . "::$_") } qw(Perso +n);
    Actually, connecting to single database is sufficient for me in most of the cases, so working without a schema would be great. How would I do this concretely? It did not find it in the documentation---apparently, working with a single database is (surprisingly) not very popular. Would I need to declare DB::Person as a subclass of ResultSource?
      Actually, connecting to single database is sufficient for me in most of the cases, so working without a schema would be great. How would I do this concretely? It did not find it in the documentation---apparently, working with a single database is (surprisingly) not very popular. Would I need to declare DB::Person as a subclass of ResultSource?

      Take a look at DBIx::Class::DB. Even if you only want to connect to a single database only, it's strongly recommended to use a schema-based setup. Further explanations can be found in DBIx::Class::DB as well.

      What's your reason against a schema, except you might never need all the features, which is not a problem in my eyes? Is it too much work to write "$schema->" all the time? I could understand that, but there are better ways around this than to use the connection-as-classdata style like Class::DBI does.

      Cheers, Flo

        Thank you for the reference and for the warning. As you have suspected, it is "$schema->" that is bothering me. Writing it is not the problem, but it makes reading a bit harder, especially because it increases the chances that an expression does not fit on one line...

        You say that there are better ways around it. Did you have something like sub resultset { $schema->resultset(@_) } in mind? This would indeed be a reasonable resolution of my concerns.