NAME

DBIx::MultiDB - join data from multiple databases

SYNOPSIS

use DBIx::MultiDB;

# Example 1

my $query = DBIx::MultiDB->new(
    dsn => 'dbi:SQLite:dbname=/tmp/db1.db',
    sql => 'SELECT id, name, company_id FROM employee',
);

$query->left_join(
    dsn           => 'dbi:SQLite:dbname=/tmp/db2.db',
    sql           => 'SELECT id, name AS company_name FROM company',
    key           => 'id',          # in this table
    referenced_by => 'company_id',  # in base table
);

$query->execute();

# Example 2

my $query = DBIx::MultiDB->new(
    dsn => 'dbi:SQLite:dbname=/tmp/db1.db',
);

$query->left_join(
    dsn           => 'dbi:SQLite:dbname=/tmp/db2.db',
    sql           => 'SELECT id, name AS company_name FROM company',
    key           => 'company_id', # in base table
    references    => 'id',         # in this table
);

$query->prepare('SELECT id, name, company_id FROM employee');
$query->execute();

while ( my $row = $query->fetchrow_hashref ) {
    # ...
}

DESCRIPTION

DBIx::MultiDB provides a simple way to join data from different sources.

You are not limited to a single database engine: in fact, you can join data from any source for which you have a DBI driver (MySQL, PostgreSQL, SQLite, etc). You can even mix them!

METHODS

new

Constructor. You can provide a dsn and sql, which is your base query.

left_join

attach

join

Once you have a base query, you can attach multiple queries that will be joined to it. For each one, you must provide a dsn, sql, and the relationship information (key and referenced_by).

Please note that this will also load the attached query into memory.

inner_join

Not yet implemented.

prepare

If you didn't provide the sql to the constructor, you can do it here. Example:

$query->prepare('SELECT id, name, company_id FROM employee');
$query->execute();

execute

Execute the base query.

fetchrow_hashref

Return a hashref, containing field names and values. The keys pointing to attached queries will be expanded into the attached queries' fields.

AUTHOR

Nelson Ferraz, <nferraz at gmail.com>

CAVEATS

While the base query is processed row by row, the joined tables must be previously stored in memory.

That means you can easily process hundreds of millions rows in the base query; but you must watch how much information you retrieve in the joins.

BUGS

Please report any bugs or feature requests to bug-dbix-multidb at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=DBIx-MultiDB. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc DBIx::MultiDB

You can also look for information at:

ACKNOWLEDGEMENTS

COPYRIGHT & LICENSE

Copyright 2010 Nelson Ferraz, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.