chromatic has asked for the wisdom of the Perl Monks concerning the following question:

I'm curious as to the best (or possible) way to store an existing Perl object in a database. I'd use the DBI module.

What I have are a handful of classes (raw objects with default data) in modules -- things are already defined there. I would be creating new instances of those objects with different data. I'd like to store those in a database.

One option would be to gather up all of the data in the instance objects, db-ify it, and use the primary key of that row in the db to pull the data out and put it into a newly made object. That's not a bad solution.

Is there any way I can store new classes and objects in a database without having to use eval all the time or write the objects to the normal filesystem and then require them?

Replies are listed 'Best First'.
Re: Storing Objects in a Database
by btrott (Parson) on Feb 19, 2000 at 01:33 UTC
    Have you looked at Storable? It may help you.

    It can store objects to the filesystem or to memory, then retrieve them, transforming them back into objects.

    So perhaps you could freeze the object to a scalar, store it in a blob in your database, pull it back out, thaw it, then use it again? I don't know--I've only tested Storable using the filesystem, but it seems logical that you could do the same thing w/ a database.

    You might be able to do something like this (untested):

    use Storable qw/freeze thaw/; use DBI; use Foo; # replace this with your module name my $object = new Foo; my $dbh = DBI->connect('bar', 'foo', 'foo', 'Oracle') or die "Can't connect: ", DBI->errstr; # store it my $sth = $dbh->prepare(<<SQL) or die "Can't prepare: ", $dbh->errstr; insert into objects (id, content) values (?, ?) SQL $sth->execute("foo", freeze $object) or die "Can't execute: ", $dbh->errstr; $sth->finish; # now get it back my $retrieve = $dbh->prepare(<<SQL) or die "Can't prepare: ", $dbh->er +rstr; select content from objects where id = ? SQL $retrieve->execute("foo"); my $content = $retrieve->fetchrow; my $unthawed = thaw $content;
    ...and now use $unthawed just as you would your original object.

    Does this sound like what you want?

      Yes, that sounds very good. In my initial perusal of the docpage, I didn't think about using freeze and thaw with DBI. Thank you very much!
RE: Storing Objects in a Database
by Anonymous Monk on Feb 21, 2000 at 07:33 UTC
    See Storable.pm or FreezeThaw.pm (YSMV - Your Spelling May Vary)