1

我有几个(约 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并从数据库本身自动创建类。但是,我发现这个解决方案对于我的需求来说并不是非常优雅和强大。

有人可以为我指出一个更优雅的解决方案吗?

4

2 回答 2

2

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

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

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;

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

于 2013-01-25T19:38:52.817 回答
0

我建议在搜索功能中使用“from”参数:

...resultset('TableA')->search({}, { from=>'TableB'});
于 2013-01-25T17:37:38.640 回答