你如何处理多个PostgreSQL模式和DBIx :: Class?

时间:2014-10-21 02:59:53

标签: perl postgresql dbix-class

在我的数据库中,我有5个单独的模式,以便我可以将对象组织成逻辑组。我使用dbicdump来创建我的DBIx :: Class模式,但注意到它只加载了公共模式中的表。我想出了如何使用dbicdump加载我的所有模式,但是现在我不知道从哪里开始设置并使用它。我在网上寻找任何资源,发现很少的文档。 The only thing I did find,我对解决方案真的不太满意。我想知道是否有人以前遇到过这个,以及他们是如何处理的。

2 个答案:

答案 0 :(得分:4)

我相信你需要一个最近的DBIx :: Class,但是我使用这样的东西:

#!/usr/bin/perl
use v5.14;

use DBIx::Class::Schema::Loader qw/ make_schema_at /;
use Path::Tiny;

my $dest_dir = '.';
my $pkg_base = 'Foo';
(my $pkg_dir = $pkg_base) =~ s/::/\//g;

# Delete any previous run
path($dest_dir.'/'.$pkg_base)->remove_tree;

make_schema_at(
    $pkg_base.'::Schema',
    {
        debug          => 0,
        dump_directory => $dest_dir,
        db_schema      => '%',
        moniker_parts  => ['schema', 'name'],
        #rescan         => 1,
    },
    [ 'dbi:Pg:dbname=mydb port=5432', 'dbuser', 'dbpass' ],
);

exit;

这给了我类似的东西:

Foo::Schema::Result::PublicTable1
Foo::Schema::Result::Schema2Table2
etc

docs中有各种选项的详细信息。我似乎记得当我把它放在一起时,我用dbicdump的源代码交叉引用了文档。

HTH

答案 1 :(得分:0)

我找到了这个,这几乎是我需要的。但是我想要传统的 :: 和真正的类(基于表)与包含随机 sql 位的视图类的分离,所以,我有:

#!/usr/bin/perl

use DBIx::Class::Schema::Loader qw/ make_schema_at /;
use Path::Tiny;

my $dest_dir = '../sql' ;
my $pkg_base = 'Cclite2';

# Delete any previous run
path($dest_dir.'/'.$pkg_base)->remove_tree;

make_schema_at(
    $pkg_base.'::Schema',
    {
        debug          => 0,
        dump_directory => $dest_dir,
        db_schema      => 'cclite2',
        moniker_parts  => ['schema', 'name'],
        moniker_part_separator => '::',
         naming         => {
            relationships    => 'v8',
            monikers         => 'v8',
            column_accessors => 'v8',
            force_ascii      => 1,

        },

    },

    [ 'dbi:Pg:dbname=dbname', 'dbuser', 'dbpass' ],
);

exit;

这给出了:

 ├── Schema
│   │   └── Result
│   │       ├── Cclite2
│   │       │   ├── OmAuth.pm
│   │       │   ├── OmCategory.pm
etc.
│   │       │   └── OmYellowpage.pm
│   │       ├── OmAdminBalanceView.pm
│   │       ├── OmAdsRss.pm
etc.
│   │       ├── OmTradesByUserView.pm
│   │       └── OmVolumeView.pm
│   └── Schema.pm

这不是对第一个答案的批评。这只是一种适合我也可能适合其他人的替代方案。