1

それぞれ 5,000 万を超えるエントリを持つ複数の (〜 100 および数え切れないほどの) MySQL テーブルがあります。問題は、このすべてのテーブルがまったく同じ構造を持っており、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 を初めて使用しますが、思いつくことができる解決策は次の 2 つだけです。

  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 に答える