【问题标题】:How do you deal with multiple PostgreSQL schemas and DBIx::Class?您如何处理多个 PostgreSQL 模式和 DBIx::Class?
【发布时间】:2014-12-16 04:15:15
【问题描述】:

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

【问题讨论】:

    标签: perl postgresql dbix-class


    【解决方案1】:

    我找到了这个,它几乎就是我所需要的。但是我想要传统的 :: 并使用包含随机 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
    

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

    【讨论】:

      【解决方案2】:

      我相信你需要一个最近的 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

      【讨论】:

      • 太棒了,谢谢!我发现 moniker_parts 所做的基本上是获取部分并将它们连接起来,在这种情况下是 schema(模式的名称)和 name(表的名称)。因此,我最终得到了 GeneralUser.pm(通用模式,用户表)。这正是我正在寻找的,我希望更容易找到这方面的文档!
      • 是的,我花了一段时间。我不确定它是否记录在旧版本的 DBIx::Class 中。
      • Cclite2OmRegistry 用于架构 cclite2 中的表 om_registry 给出 [2021-04-13 13:12:45.49656] [9448] [error] Cclitedb628 获取错误 $VAR1 = bless( { 'msg' => 'DBIx::Class::Storage::DBI::_dbh_execute(): DBI Exception: DBD::Pg::st execute failed: ERROR: relation "om_registry" does not exist LINE 1: ... me.tags, me.nodetypes, me.feed, me.networks FROM om_registr... 应该是 cclite2 的位置。 om_registry。我做错了什么?
      猜你喜欢
      • 2013-09-04
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2014-04-24
      • 2014-09-01
      • 1970-01-01
      • 2011-07-09
      • 2022-06-29
      相关资源
      最近更新 更多