2013-03-21 35 views
0

我創建了一個模型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」 (也許你忘了加載「MyApp :: Schema」?)at ...

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

+0

由於您使用催化劑,您可以在應用程序開始使用單例時初始化架構。那麼它應該在整個應用程序中可用。 – jmcneirney 2013-03-21 15:20:55

回答

0

我在Catalyst::Model::DBIC::Schema中讀到我們可以使用$ self-> schema從任何地方訪問數據庫模式。所以這個變種工作得很好:

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

你忘了加載MyApp::Schema

當您在子程序中調用MyApp::Schema->connect時,其他某個催化劑組件可能已經加載了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") 
} 

現在你的架構對象被初始化一次,在需要時,和所有其他相關模塊後,可能是你的應用程序依賴於已被加載。

+1

您的回答沒有任何意義,因爲如果使用幫助程序生成DBIC模型,則包含的代碼可以在沒有任何猜測的情況下即時運行。它負責加載模式本身,不需要手動執行。 – 2013-03-21 17:01:08

2

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支持的特殊語法。

+0

'請注意,您通常不會將任何方法添加到Catalyst模型中哦,並且必須在哪裏保留它們? – edem 2013-03-21 17:20:51

+1

取決於方法應該做什麼。如果它們應該可調用到DBIC $行對象上,則它們將進入結果類,如果它的結果​​集的方法(如預定義的搜索)進入該表的結果集類中。這些都是DBIx :: Class相關的東西,如果你使用帶有Catalyst或別的東西的DBIC模型,就無能爲力。 – 2013-03-22 10:38:47

+0

哈,謝謝。我不知道用定義表工作的方法可能會保留在resultset類中。 – edem 2013-03-22 11:12:17

相關問題