1

When using Class::DBI in Perl, the insert() method from Class::DBI acts as a constructor returning an object. How can I use Class::DBI in combination with object attributes that are not part of any database tables?

For example: I would like to have my Music::Artist class to have a version attribute that is part of the resulting objects (so that I can use this object attribute in my overall application logic), but does not get written to the database?

Ultimately I would like to be able to combine the usage of Class::DBI with OO-systems like Moo(se).

Vanilla Class:DBI example code from metacpan:

package Music::DBI;
use base 'Class::DBI';
Music::DBI->connection('dbi:mysql:dbname', 'username', 'password');

package Music::Artist;
use base 'Music::DBI';
Music::Artist->table('artist');
Music::Artist->columns(All => qw/artistid name/);


#-- Meanwhile, in a nearby piece of code! --#

my $artist = Music::Artist->insert({ artistid => 1, name => 'U2' });

Pseude-code of what I would like to do:

package Music::Artist;
use base 'Music::DBI';
use Moo;

Music::DBI->connection('dbi:mysql:dbname', 'username', 'password');
Music::Artist->table('artist');
Music::Artist->columns(All => qw/artistid name/);

has name => ( is => 'rw' );
has version => ( is => 'rw' );


#-- Meanwhile, in a nearby piece of code! --#

my $artist = Music::Artist->new( name => 'U2', version => '0.1.0' );

$artist = Music::Artist->insert({ artistid => 1, name => $artist->name });

# ... do something with $artist->version ...

(Although this code could run, Class::DBI's insert() of cause overrides the object returned by Moo's new() in the first place.)

How to combine Class::DBI with own or third-party (Moo) constructors?

I read Class::DBIs documentation but did not find any information on how to override insert() as an approach to supply a combined constructor method. I also tried to find repositories on GitHub that make use of Class::DBI and own constructors or OO-systems in the same packages, but did not succeed either.

ilonw
  • 19
  • 1
  • 3
    Class::DBI has been unsupported for 15 years. I really don't recommend using it. Please consider switching to something like [DBIx::Class](https://metacpan.org/dist/DBIx-Class). – Dave Cross Feb 01 '23 at 12:01
  • You might also check out Rose::Object https://metacpan.org/pod/Rose::DB::Object – turtle Feb 18 '23 at 21:08

0 Answers0