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

问题描述 投票:0回答:3

在我的数据库中,我有 5 个独立的模式,以便我可以将对象组织成逻辑组。我使用

dbicdump
创建 DBIx::Class 模式,但注意到它只从公共模式加载表。我想出了如何使用 dbicdump 加载所有模式,但现在我不知道从这里开始哪里设置和使用它。我在网上查找了所有资源,但发现的文档很少。 我唯一发现的事情,我真的对这个解决方案不太满意。我想知道是否有人遇到过这种情况,以及他们是如何处理的。

perl postgresql dbix-class
3个回答
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

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

HTH


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

这不是对第一个答案的批评。这只是一个适合我的选择,也可能适合其他人。


0
投票

您必须向 make_schema_at 提供如下选项,才能正确设置数据库模式:

# list the schemas you want to include (also works with 'public' etc.)
db_schema => ['schema1', 'schema2',...],
# make queries work, by using schema.table instead of only table name
qualify_objects => 1,
# set up proper namespacing for result classes
moniker_parts => ['schema', 'name'],
moniker_part_separator => '::',

来源:

  1. db_schema
  2. 限定对象
  3. 跨 PostgreSQL/DB2/Oracle 模式使用 DBIx::Class
  4. moniker_parts
  5. moniker_part_separator
© www.soinside.com 2019 - 2024. All rights reserved.