[Dbix-class] Using and inter-linking multiple databases via DBIC: "Can't find source"

Mark West mdwestie at gmail.com
Tue Dec 3 19:24:52 GMT 2013


Hello,

 

I am trying to create a similar set up connecting to two postgres databases
on the same host and having no luck. (These are two separate databases not
two schemas.)

 

I am using Schema::Loader to create my result class files as well as the
database connection files using the following commands:

 

script/myapp_create.pl model DB DBIC::Schema MyApp::Schema create=static
components=TimeStamp,EncodedColumn dbi:Pg:dbname=handshake_vt 'user' 'pw' '{
AutoCommit => 1 }'

 

script/myapp_create.pl model DB2 DBIC::Schema MyApp::Schema create=static
components=TimeStamp,EncodedColumn dbi:Pg:dbname=legislators_vt 'user' 'pw'
'{ AutoCommit => 1 }'

 

I get the following error when trying to connect to tables on the second
database [error] DBI Exception: DBD::Pg::st execute failed: ERROR:  relation
"countries" does not exist

 

I've created the following files:

 

1.    DB.pm

 

package MyApp::Model::DB;

 

use strict;

use base 'Catalyst::Model::DBIC::Schema';

 

__PACKAGE__->config(

    schema_class => 'MyApp::Schema',

 

    connect_info => {

        dsn => 'dbi:Pg:dbname=handshake_vt',

    }

);

 

 

2.    DB2.pm

 

package MyApp::Model::DB2;

 

use strict;

use base 'Catalyst::Model::DBIC::Schema';

 

__PACKAGE__->config(

    schema_class => 'MyApp::Schema',

 

    connect_info => {

        dsn => 'dbi:Pg:dbname=legislators_vt',

    }

);

 

 

3.    Schema.pm

 

package MyApp::Schema;

 

__PACKAGE__->load_namespaces;;

 

 

 

My Table Class basically looks like this:

 

package Handshake::Schema::Result::Country;

 

.

 

__PACKAGE__->table("countries");

 

 

In my controller I'm calling the model by specifying the second database
handle.

 

So, have I misconfigured one of these files or am I missing another
configuration step to connect to two databases at one time?

 

Or, is there another example of a Schema::Loader script that will set up the
dual connection?

 

Thanks for any help.

 

Mark

 

 

 

 

From: Henry Van Styn [mailto:vanstyn at cpan.org] 
Sent: Friday, October 18, 2013 3:13 PM
To: DBIx::Class user and developer list
Subject: Re: [Dbix-class] Using and inter-linking multiple databases via
DBIC: "Can't find source"

 

On 10/18/2013 1:26 PM, will trillich wrote:

We are using Catalyst for a web app. We've split off the authentication
database to facilitate multiple different apps using the same user
credentials, but we're having trouble linking the auth db to the biz-info
db. 

 

The generalized user/team credentials and related info are in Auth, and the
actual business info for this app is in DB. Here's an object from the DB
database:

 

 

package Learn::Schema::DB::Result::TeamEmail;


#...

__PACKAGE__->belongs_to( team => 'Learn::Schema::Auth::Result::Team' );

 

 

Note that we're trying to get DB::TeamEmail to refer to Auth::Team here. And
below is the related object from the Auth database:

 

 

package Learn::Schema::Auth::Result::Team;


#...

__PACKAGE__->has_many( emails => 'Learn::Schema::DB::Result::TeamEmail',
'team' );                                                                

 

 

At this point we expect

 

$team->emails_rs

 

to work but instead we get

 

Can't find source for Learn::Schema::DB::Result::TeamEmail

 

because TeamEmail isn't in $self->source_registrations (full names) or
$self->class_mappings (brief names) in the DBIx::Class::Schema::source()
method.

 

 

Pointers? Is there a different approach? Got a clue stick?

 

 


You probably just need to load the additional result classes into your
schema.

Assuming you are using the typical __PACKAGE__->load_namespaces call in your
Schema class, you can call it with parameters to find classes under multiple
namespaces. Something like this in your Learn::Schema::DB:

 __PACKAGE__->load_namespaces(
   result_namespace    => [ '+Learn::Schema::Auth::Result', 'Result' ],
   resultset_namespace => [ '+Learn::Schema::Auth::ResultSet','ResultSet' ],
 );

See https://metacpan.org/module/DBIx::Class::Schema#load_namespaces for more
details

You will also probably need to make sure you use 'dbname.tablename' instead
of just 'tablename' in the __PACKAGE__->table() call in your result classes.
If you're using Schema::Loader, see the 'qualify_objects' option to have
this generated automatically:

https://metacpan.org/module/DBIx::Class::Schema::Loader::Base#qualify_object
s

Hope this helps,
 
vanstyn

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20131203/0998d3f3/attachment-0001.htm


More information about the DBIx-Class mailing list