[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