如何从DBIC :: Schema创建Catalyst :: Model :: DBIC :: Schema?

时间:2015-08-18 21:06:16

标签: perl catalyst dbix-class

完全没有文件证明这很难......

基本上,我有

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时出错:无法实例化组件&#34;必须为MyCatApp :: Model :: MyApp定义 - > gt> config-&gt; {connect_info}或MyApp :: Schema必须定义连接信息在它上面。

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

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

__PACKAGE__->config('schema_class', MyApp::Schema->new_schema)
然后我得到......

  

加载时出错:无法实例化组件&#34; MyCatApp :: Model :: MyApp&#34;,&#34;属性(schema_class)不传递类型约束,因为:&#验证失败39;催化剂::型号:: DBIC ::模式::种类:: SchemaClass&#39;在/usr/local/lib/perl/5.18.2/Moose/Exception.pm第37行使用值MyApp :: Schema = HASH(0xb4a5ff0)

那么,我该如何做呢......

3 个答案:

答案 0 :(得分:0)

所以..我不确定这是对的,所以我不会把它标记为被接受,但我非常接近..这条线已经死了......

__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->storage && $schema_class->storage->connect_info)

我提交了bug on this here

答案 1 :(得分:0)

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

__PACKAGE__->connection(@your_connection_details);

这将在类本身上设置存储,而不是架构对象。然后,这将通过Catalyst::Model::DBIC::Schema检查并成功运行。我认为这可以在不改变基础类的情况下实现您所追求的目标(尽管可能取决于未包含的细节)。

答案 2 :(得分:-1)

在您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->model('MyApp');