【问题标题】:How to create global var $schema for connection to DB in Catalyst app?如何在 Catalyst 应用程序中创建全局 var $schema 以连接到数据库?
【发布时间】:2013-03-21 15:09:43
【问题描述】:

我创建了一个模型 lib/MyApp/Model/Foo.pm。里面:

...
sub bar {
  my $schema = MyApp::Schem->connect("dbi:SQLite:data.db");
}
...

它工作正常,但是当我这样写时:

...
my $schema = MyApp::Schema->connect("dbi:SQLite:data.db");
sub bar {}
...

它不起作用并写这个:

无法通过包“MyApp::Schema”定位对象方法“connect” (也许您忘记加载“MyApp::Schema”?)在 ...

我想创建全局 $schema var 以在不同的方法中使用它。我怎样才能到达它?

【问题讨论】:

  • 由于您使用的是催化剂,您可以在应用程序开始使用单例时初始化架构。然后它应该在整个应用程序中都可用。

标签: perl catalyst dbix-class


【解决方案1】:

Catalyst::Model::DBIC::Schema 为每个可能启动的进程自动处理连接数据库。

如果您使用概要中所示的帮助程序创建 MyApp::Model::DBIC,它将开箱即用。对于 SQLite,数据库凭据或数据库文件名通常放在 Catalyst::Plugin::ConfigLoader 加载的 Catalyst 配置文件中。

请注意,您通常不会向 Catalyst 模型或 DBIx::Class 模式添加任何方法。

要访问模型,无论其类型如何(DBIC、LDAP、...),您都必须在 Catalyst 中使用 $c->model($modelname)。因此,如果您将模型命名为 MyApp::Model::DBIC,这将是 $c->model('DBIC')。 要访问 DBIC 结果集,您可以使用$c->model('DBIC')->resultset('Foo')$c->model('DBIC::Foo'),这是Catalyst::Model::DBIC::Schema 支持的特殊语法。

【讨论】:

  • Note that you normally don't add any methods to the Catalyst model 哦,我必须把它们放在哪里?
  • 取决于方法应该做什么。如果它们应该可以调用到 DBIC $row 对象上,它们会进入结果类,如果它是结果集的方法,例如预定义搜索,则它会进入该表的结果集类。这些都是与 DBIx::Class 相关的东西,如果您将 DBIC 模型与 Catalyst 或其他东西一起使用,则无关紧要。
  • 哈,谢谢。我不知道使用已定义表的方法可能保存在结果集类中。
【解决方案2】:

你忘记加载MyApp::Schema了吗?

当您在子例程中调用 MyApp::Schema->connect 时,很可能某个其他 Catalyst 组件已经加载了 MyApp::Schema 模块并使 connect 方法可用。

在子程序之外,您的应用程序将在您的MyApp::Model::Foo 模块加载时尝试调用MyApp::Schema::connect,它是否成功取决于加载其他包的顺序。所以在 MyApp::Model::Foo 包的顶部写 use MyApp::Schema; 可能会解决你的问题。


另一件可能解决您的问题的事情是架构的延迟初始化。将模型中所有$schema 的实例替换为函数调用,例如schema(),并包含以下代码:

my $_schema;
sub schema {
    $_schema //= MyApp::Schem->connect("dbi:SQLite:data.db")
}

现在,您的架构对象会在需要时初始化一次,并且可能在您的应用程序所依赖的所有其他相关模块都已加载之后。

【讨论】:

  • 您的回答没有任何意义,因为如果使用生成 DBIC 模型的助手,则包含的代码将开箱即用,无需任何猜测。它负责加载架构本身,无需手动执行。
【解决方案3】:

我在Catalyst::Model::DBIC::Schema 中读到,我们可以使用 $self->schema 从任何地方访问数据库模式。所以这个变体工作正常:

sub bar {
  my ($self) = @_;
  my $schema = $self->schema;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2022-12-03
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2016-11-14
    • 2012-09-14
    相关资源
    最近更新 更多