如何在Catalyst with DBIC中创建多个数据库连接

时间:2013-12-06 13:27:37

标签: database perl postgresql catalyst dbix-class

我正在尝试连接到同一主机上的两个postgres数据库并且没有运气。 (这是两个独立的数据库,而不是两个模式。)

我使用Schema::Loader使用以下命令创建结果类文件以及数据库连接文件:

第一个数据库

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

对于我的第二个数据库,我应该将表类放在同一个Schema中,如下所示:

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

或者我应该像这样创建一个单独的模式name_space:

script/myapp_create.pl model DB2 DBIC::Schema MyApp::Schema::Members create=static dbi:Pg:dbname=members_vt 'user' 'pw' '{ AutoCommit => 1 }'

我尝试了两种方法,并且两种方法都有不同的错误。

以下是我使用单一架构适用的文件:

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基本上是这样的:

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

…

__PACKAGE__->table("countries");

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

创建不同模式的第一种方法是每个数据库,这是正确的模式。

每个数据库在不同的Perl名称空间中都有自己的DBIx::Class模式。

如果您将在Catalyst应用程序之外使用DBIC架构,那么在Catalyst应用程序之外选择一个命名空间也是有意义的,

例如Company::Model::DB1, Company::Model::DB2 and Company::Web::App

然后使用不同的连接参数为每个DBIx :: Class架构创建一个Catalyst模型。

在Catalyst中,您可以使用$c->model('DB1')$c->model('DB2')访问这两个模型。

答案 1 :(得分:0)

您需要创建两个单独的模式(不是一个)和两个模型。