使用具有单个结果类定义的DBIx :: Class来处理具有相同结构的多个表

时间:2013-01-25 04:05:22

标签: perl dbix-class

我有几个(约100个计数)MySQL表,每个表的条目超过50M。问题是所有这些表都有完全相同的结构,我想在DBIx :: class中为它们创建一个结果类。 例如,考虑一系列具有以下结构的表:

CREATE TABLE users_table_1 (
  name TINYTEXT,
  username TINYTEXT
);
CREATE TABLE users_table_2 (
  name TINYTEXT,
  username TINYTEXT
);
...

我希望能够在不必为每个表创建结果类的情况下执行以下操作。

my $users_1_rs = $schema->resultset('User_table_1');
my $users_2_rs = $schema->resultset('User_table_2');
...

我是DBIx :: Class的新手,我能提出的唯一两个可能的解决方案是:

  1. 对于每个表,使用DBIx::Class::DynamicSubclass之类的东西来从具有所有常用功能的基础结果类创建子类。缺点是这样我仍然需要为我的每一个表编写一个类(尽管是一个小类)。
  2. 使用DBIx::Class::Loader并从数据库本身自动创建类。但是,我发现这个解决方案并不是非常优雅和强大,可满足我的需求。
  3. 有人能指出我对这个问题更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:2)

DBIx::Class中可能有一个元编程 API,用于动态创建表类。

代替深入研究(相当大的DBIx::Class)文档,这是在普通Perl 元编程中创建类的另一个例子:

package MySchema;
use strict;
use warnings;
use parent 'DBIx::Class::Schema';

our @tables = map { 'users_table_' . $_ } 1..2;

require DBIx::Class::Core;

# build table classes for users_tables_*
for my $table (@MySchema::tables) {
    my $t = "MySchema::$table";
    {
        no strict 'refs';
        @{$t . '::ISA'} = qw/DBIx::Class::Core/;
    }
    $t->table($table);
    $t->add_columns(qw/name username/);
}

__PACKAGE__->load_classes(@MySchema::tables);

1;

在我的简单测试中,以上对我有用:)

答案 1 :(得分:0)

我会在搜索功能中使用“from”参数来提取:

...resultset('TableA')->search({}, { from=>'TableB'});