【问题标题】:Rose::DB::Object::Manager query with a list of object idsRose::DB::Object::Manager 查询带有对象 ID 列表
【发布时间】:2012-01-24 20:12:48
【问题描述】:

我正在尝试使用 Array 或 Hash 编写 Rose::DB::Object 查询字符串,但是我不确定如何去做。我正在尝试根据数组中枚举的列表中的某些 ID 编写更新函数。不幸的是,我没有任何其他唯一键来过滤以构建查询,因此我需要查询特定的 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::Manager 并在每条记录的基础上进行 DB 调用,因为此脚本将通过 cron 每 60 秒运行一次,并且有可能返回大集合。

【问题讨论】:

    标签: perl rose-db-object


    【解决方案1】:

    query 参数采用对名称/值对数组的引用,而不是对哈希引用数组的引用。如果您想要 id 列的值是值列表之一的对象,则使用名称 id 和对 id 数组的引用作为值。这段代码应该可以工作(假设 id 值在@_):

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

    【讨论】:

    • 那行得通!,它对从 Sybase SQL 查询中收集的数组中的元素抛出错误,结果将 \x00 附加到导致 Oracle 查询的数组中的每个元素上我正在使用 Rose::DB 失败。希望 Rose::DB 能得到 Sybase 的支持。
    【解决方案2】:

    当您需要推送 perl 结构时,您将字符串推送到 @ary

        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 => \@_ ]);
        ...
    

    从未使用过 Rose,这是基于模块的文档。

    【讨论】:

    • 我也尝试了上述方法,但无论我尝试什么方式,我都会得到一个无效的查询字符串。我几乎怀疑我需要一个哈希,但不确定如何使用哈希,因为“id”将是一个重复键。
    猜你喜欢
    • 2011-07-06
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多