加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Catalyst&Perl – 在运行时生成模型

发布时间:2020-12-15 23:34:02 所属栏目:大数据 来源:网络整理
导读:我正在开发一个将在运行时生成数据库表的应用程序.我正在使用Catalyst和DBIC,我需要在生成新表时生成新的ResultSet.这个新的ResultSet必须作为Catalyst模型添加,所以我可以$c- model(‘DB :: NewFoo’),但我需要在运行时发生这种情况. 表生成和ResultSet生成
我正在开发一个将在运行时生成数据库表的应用程序.我正在使用Catalyst和DBIC,我需要在生成新表时生成新的ResultSet.这个新的ResultSet必须作为Catalyst模型添加,所以我可以$c-> model(‘DB :: NewFoo’),但我需要在运行时发生这种情况.

表生成和ResultSet生成不是问题,我需要的是在运行时将那些新生成的ResultSet添加到Model中,以便我可以在进一步的请求中调用它们.

到目前为止,我的想法是创建一个控制DBI :: Class :: Schema的类,提供访问器方法并提供一种在运行时更新和重新加载Schema的方法.我想要一个使用Catalyst本身的不同想法.

感谢您提供的所有帮助.

解决方法

这并不完美,但它对我们有用.

如果你在MyApp.pm文件中重载模型方法看起来像这样:

sub model {
    my ($self,$model,@rest) = @_;

    if (my ($rs) = $model =~ m/^DB::(.+)$/) {
       $self->model('DB')->schema->resultset($rs)
    } else {
       return $self->next::method($model,@rest);
    }
 }

然后在你的Schema.pm中添加这样的东西:

use List::Util 'first';
 sub resultset {
    my ($self,$rs) = @_;
    unless (first { $_ eq $rs } $self->sources) {
       eval "require MyApp::Schema::NonDefaultResult::$rs";
       $self->register_class("$rs","MyApp::Schema::NonDefaultResult::$rs");
    }
    return $self->next::method($rs);
 }

要点是,现在如果你要求一个未加载的结果集,它会在运行时从一些其他命名空间加载(因为你可能还想在编译时加载许多其他结果.)

多年来我们一直在使用它来生成数百个生成的表,并且运行良好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读