2012-01-23 48 views
0

我想寫一個使用陣列或散列的Rose :: DB :: Object查詢字符串,但我不確定如何去做吧。我試圖編寫一個更新函數基於列表中列舉的數組中的某些ID。不幸的是,我沒有任何其他唯一鍵來過濾構建查詢,所以我需要查詢特定的ID。玫瑰:: DB ::對象::管理器查詢與對象ID列表

從本質上講,我想以編程寫如下:

my $list = My::DB::Manager->get_items(query => [ 
    {id => 1}, 
    {id => 14}, 
    {id => 210}, 
    {id => 1102}, 
    {id => 3151}, 
]); 

這是我到目前爲止的代碼,但我一直沒能順利實現我想做的事:

 use My::DB::Manager; 
     my @ary; 
     foreach (@_) { 
      my %col = ("id", $_); 
      push (@ary, \%col); 
     } 
     my $list = My::DB::Manager->get_items(query => \@ary); 
     ... 

./test.pl

現在腳本只是掛起而沒有輸出不確定。

我試圖避免迭代通過DB ::管理器,並在每個記錄的基礎上進行數據庫調用,因爲此腳本將每60秒通過cron運行,並有可能返回大集。

回答

1

query參數引用一個名稱/值對的數組,而不是對散列引用數組的引用。如果您想要其中id列的值爲值列表之一的對象,請使用名稱id和對數組ID的引用作爲值。此代碼應該工作(假定ID值在@_):

$list = My::DB::Manager->get_items(query => [ id => \@_ ]); 
+0

That worked !,它爲我的數組中的元素拋出了一個錯誤,這是從Sybase SQL查詢中收集的,並且結果將\ x00附加到數組中的每個元素上,導致我正在使用Rose :: DB的Oracle查詢失敗。希望Rose :: DB將得到Sybase的支持。 – Mose

0

你推絃爲@ary當你需要推perl的結構:

use My::DB::Manager; 
    my @ary; 
    foreach (@_) { 
      push (@ary, { id => $_ }); 
    } 
    my $list = My::DB::Manager->get_items(query => [@ary]); 
    ... 

不過,我想你可以使用query => [ id => [$id1, $id2, ... ], ...]

use My::DB::Manager; 
    my $list = My::DB::Manager->get_items(query => [ id => \@_ ]); 
    ... 

沒用過玫瑰,此基礎上的文檔模塊。

+0

我嘗試了上面很好,但無論如何我嘗試它,我得到一個無效的查詢字符串。我幾乎懷疑我需要一個散列,但不知道如何使用散列,因爲「id」將是一個重複鍵。 – Mose