No description or website provided.
Perl Perl6
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


ObjectDB - usable ORM


package MyDB;
use base 'ObjectDB';

sub init_db {
    return $dbh;

package MyAuthor;
use base 'MyDB';

    table          => 'author',
    columns        => [qw/id name/],
    primary_key    => 'id',
    auto_increment => 'id',
    relationships  => {
        books => {
            type = 'one to many',
            class => 'MyBook',
            map   => {id => 'author_id'}

package MyBook;
use base 'MyDB';

    table          => 'book',
    columns        => [qw/id author_id title/],
    primary_key    => 'id',
    auto_increment => 'id',
    relationships  => {
        author => {
            type = 'many to one',
            class => 'MyAuthor',
            map   => {author_id => 'id'}

my $book_by_id = MyBook->new(id => 1)->load(with => 'author');

my @books_authored_by_Pushkin =
  MyBook->table->find(where => ['' => 'Pushkin']);

$author->create_related('books', title => 'New Book');


ObjectDB is a lightweight and flexible object-relational mapper. While being light it stays usable. ObjectDB borrows many things from Rose::DB::Object, but unlike in the last one columns are not objects, everything is pretty much straightforward and flat.

Supported servers: SQLite, MySQL, PostgreSQL

Actions on columns


  • set_columns

    Set columns.

    $book->set_columns(title => 'New Book', pages => 140);
  • set_column

    Set column.

    $book->set_column(title => 'New Book');
  • get_column

    my $title = $book->get_column('title');
  • column

    A shortcut for set_column/get_column.

    $book->column(title => 'New Book');
    my $title = $book->column('title');

Actions on rows

Main ObjectDB instance represents a row object. All actions performed on this instance are performed on one row. For performing actions on several rows see ObjectDB::Table.


  • create

    Creates a new row. If meta has an auto_increment column then it is properly set.

    my $author = MyAuthor->new(name => 'Me')->create;

    It is possible to create related objects automatically:

    my $author = MyAuthor->new(
        name  => 'Me',
        books => [{title => 'Book1'}, {title => 'Book2'}]

    Which is a convenient way of calling C manually .

  • load

    Loads an object by primary or unique key.

    my $author = MyAuthor->new(id => 1)->load;

    It is possible to load an object with related objects.

    my $book = MyBook->new(title => 'New Book')->load(with => 'author');
  • update

    Updates an object.

    $book->set_column(title => 'Old Title');
  • delete

    Deletes an object. Related objects are NOT deleted.


Actions on tables

In order to perform an action on table a ObjectDB::Table object must be obtained via table method (see ObjectDB::Table for all available actions). The only exception is find, it is available in a row object for convenience.

MyBook->table->delete; # deletes ALL records from MyBook

Actions on related objects


  • related

    Returns preloaded related objects or loads them on demand.

    # same as find_related but with caching
    my $description = $book->related('book_description');
    # returns from cache
    my $description = $book->related('book_description');
  • create_related

    Creates related object, setting appropriate foreign keys. Accepts a list, a hash reference, an object.

    $author->create_related('books', title => 'New Book');
    $author->create_related('books', MyBook->new(title => 'New Book'));
  • find_related

    Finds related object.

    my $books = $author->find_related('books', where => [title => 'New Book']);
  • update_related

    Updates related object.

        set   => {title => 'Old Book'},
        where => [title => 'New Book']
  • delete_related

    Deletes related object.

    $author->delete_related('books', where => [title => 'New Book']);


All the exceptions will be catched, a rollback will be run and exceptions will be rethrown. It is safe to use rollback or commit inside of a transaction when you want to do custom exception handling.

    sub {
        ... do smth that can throw ...

txn's return value is preserved, so it is safe to do something like:

my $result = MyDB->txn(
    sub {
        return 'my result';


  • txn

    Accepts a subroutine reference, wraps code into eval and runs it rethrowing all exceptions.

  • commit

    Commit transaction.

  • rollback

    Rollback transaction.

Utility methods


  • meta

    Returns meta object. See ObjectDB::Meta.

  • init_db

    Returns current DBI instance.

  • is_modified

    Returns 1 if object is modified.

  • is_in_db

    Returns 1 if object is in database.

  • is_related_loaded

    Checks if related objects are loaded.

  • clone

    Clones object preserving all columns except primary or unique keys.

  • to_hash

    Converts object into a hash reference, including all preloaded objects.


Viacheslav Tykhanovskyi


Copyright 2013, Viacheslav Tykhanovskyi.

This module is free software, you may distribute it under the same terms as Perl.