【问题标题】:How do I create a Catalyst::Model::DBIC::Schema from a DBIC::Schema?如何从 DBIC::Schema 创建 Catalyst::Model::DBIC::Schema?
【发布时间】:2015-08-18 21:06:16
【问题描述】:

完全缺乏文档使这变得困难..

基本上,我有

package MyApp::Schema;
sub new_schema {
   __PACKAGE__->connect(...)
}

那我有

package MyCatApp::Model::MyApp;
use Moose;
extends 'Catalyst::Model::DBIC::Schema';

## what here;

_PACKAGE__->make_immutable;

我该如何进行这项工作?如果我的配置中有这个...

<Model::MyApp>
        schema_class   MyApp::Schema
        traits Caching
        user_defined_schema_accessor foo
</Model::MyApp>

我收到following error

BEGIN 失败--编译在 MyCatapp.psgi 第 4 行第 1 行中止。 加载 MyCatapp.psgi 时出错:无法实例化组件“必须为 MyCatApp::Model::MyApp 或 MyApp::Schema 定义任何 ->config->{connect_info} 必须在其上定义连接信息。

但是在MyApp::Schema 中添加sub connect_info {} 不会改变任何东西。该错误是在line 480 of this file 上生成的。

该方法似乎正在查看$schema_class-&gt;storage-&gt;connect_info,我认为它是实例化对象上的方法,而不是包中的函数。但是,如果我尝试设置

__PACKAGE__->config('schema_class', MyApp::Schema->new_schema)

然后我得到...

加载时出错:无法实例化组件“MyCatApp::Model::MyApp”,“属性(schema_class)未通过类型约束,因为:'Catalyst::Model::DBIC::Schema: 验证失败: :Types::SchemaClass' 值 MyApp::Schema=HASH(0xb4a5ff0) 在 /usr/local/lib/perl/5.18.2/Moose/Exception.pm 第 37 行

那么,我该怎么做呢……

【问题讨论】:

    标签: perl catalyst dbix-class


    【解决方案1】:

    所以..我不确定这是否正确,所以我不会将其标记为已接受,但我非常接近..这条线已经死了..

    __PACKAGE__->config('schema_class', MyApp::Schema->new_schema)
    

    根据上面line 480 of Catalyst::Model::DBIC::Schema 上的链接,代码已经到位,可以正常工作。但是,类型不对。。

    type of schema_class is SchemaClass。还有,SchemaClass is defined here

    subtype SchemaClass,
        as LoadableClass,
        where { $_->isa('DBIx::Class::Schema') };
    

    现在,SchemaClassMooseX::Types::LoadableClass 的子类型,它基本上只需要一个包名并需要它..

    问题是 LoadableClass 不采用 DBIC::Schema 的实例。无论如何..我也只是改变了它..

    has schema_class => (
        is => 'ro',
        isa => 'Object',
        required => 1
    );
    

    现在我可以将实例化的模式填充到 schema_class 并传递条件 if($schema_class-&gt;storage &amp;&amp; $schema_class-&gt;storage-&gt;connect_info)

    我提交了bug on this here

    【讨论】:

    • 模型不需要实例化的 dbic 模式实例。它需要类和 connect_info 来实例化它本身,这是我所见过的。将模式对象作为参数传递给 schema_class 似乎不合适。您的 connect_info 子没有返回任何连接信息。它想知道如何连接以获得连接的模式对象。
    • connect_info 子程序根本没有被调用。 Afaik,链接的代码称为$schema_class-&gt;storage-&gt;connect_info。如果 $schema_class 确实已经是一个模式对象(如果您已经连接),那么您只有一个 $schema_class-&gt;storage
    【解决方案2】:

    您可以在 MyApp::Schema 中实例化连接信息:

    __PACKAGE__-&gt;connection(@your_connection_details);

    这将在类本身上设置一个存储,而不是模式对象。这将通过Catalyst::Model::DBIC::Schema 检查并成功运行。我认为这可以在不更改底层类的情况下实现您的目标(尽管可能取决于未包含的细节)。

    【讨论】:

      【解决方案3】:

      根据您referenced 的文档,您的MyCatApp::Model::MyApp 看起来像这样:

      __PACKAGE__->config(
        schema_class => 'MyApp::Schema',
        connect_info => {
          dsn => 'dbi:Pg:dbname=mypgdb',
          user => 'postgres',
          password => '',
          pg_enable_utf8 => 1,
          on_connect_do => [
            'some SQL statement',
            'another SQL statement',
          ],
        }
      );
      

      在你的控制器中,你会:

      my $db = $c-&gt;model('MyApp');

      【讨论】:

      • 不,这不是一个例子。 My Schema 有非常复杂的连接逻辑,它可以自己连接。我想让 Schema 处理连接和逻辑,并且很明显,因为引用的代码支持有逻辑可以做到这一点......而且,由于错误消息支持功能应该在那里 或 MyApp::Schema 必须有连接上定义的信息。
      • 嗯,很好。我们也有复杂的连接逻辑,但归根结底,它总是一个 dsn、用户通行证和选项。该逻辑被封装,模式和模型适配器类都使用它。在模型中,around BUILDARGS 修饰符用于调用复杂的逻辑以获取 dsn 用户通行证并调整 connection_info,模型被愉快地实例化。很高兴你也能正常工作。干杯。
      • 好吧,我通过黑客 C:M:DBIC:S 得到了我的工作。但是,afaik,这就是意图。除非有人可以向我解释 L480 上的代码应该如何工作,否则我认为这是一个错误。
      猜你喜欢
      • 2019-06-17
      • 2023-03-11
      • 2017-06-14
      • 2010-11-08
      • 2019-12-21
      • 2017-11-09
      • 1970-01-01
      • 2014-01-22
      • 2019-10-13
      相关资源
      最近更新 更多