[PerlChina] 关于DBIx::Class::ResultClass::HashRefInflator一点问题

cui robin cuiyuming at gmail.com
Tue Mar 18 04:42:08 PDT 2008


2008/3/18 Fayland Lam <fayland at gmail.com>:

> cui robin wrote:
> > 2008/3/18 cui robin <cuiyuming at gmail.com <mailto:cuiyuming at gmail.com>>:
> >
> >     HI,
> >     我是昨天问过DBIC数据向JSON转换的家伙,在fayland的提示下,开始使用
> >     DBIC中包含的的HashRefInflator模块,将结果先转换成hash,然后再用
> >     Catalyst::View::JSON转成JSON。
> >     可是我发现个问题,如果我用resultset的find方法,如下:DataDumper可
> >     以看出得到一个正确的Hash结果,但是如果使用 search得到的结果,其中
> >     的内容还是object的,很多冗余信息。
> >     大家有遇到这个问题么?
> >
> >     #! /usr/bin/perl
> >     use lib './';
> >     use CBSDB;
> >     use Data::Dumper;
> >     use DBIx::Class::ResultClass::HashRefInflator;
> >
> >     my $dsn='dbi:mysql:dbStatus;192.168.182.5';
> >     my $user='dbstatus';
> >     my $pass='dbstatus';
> >     my $schema = CBSDB->connect($dsn,$user,$pass);
> >     $schema->storage->debug(1);
> >
> >     my $rs_base_mach = $schema->resultset('Base_mach');
> >
> $rs_base_mach->result_class('DBIx::Class::ResultClass::HashRefInflator');
> >     #$base_mach = [$rs_base_mach->search({'me.app' =>
> >     'Penguin'},{join=>'mach_group',prefetch=>'mach_group'})];
> >     $base_mach=$rs_base_mach->find('172.24.68.93 <http://172.24.68.93
> >');
> >     print Data::Dumper->Dumper($base_mach);
> >
> >     robincui
> >
> >
> > 我尝试昨天fayland说的另外一个方法是可以的,如下:
> > my $rs_base_mach = $schema->resultset('Base_mach');
> >
> $rs_base_mach->result_class('DBIx::Class::ResultClass::HashRefInflator');
> > @base_mach = $rs_base_mach->search({'me.app' =>
> > 'Penguin'},{join=>'mach_group',prefetch=>'mach_group'});
> > for (@base_mach) {
> > $_ = $_->{_column_data};
> > }
> > print Data::Dumper->Dumper(\@base_mach);
> >
> > 不明白为什么昨天fayland邮件里说如果有relationship的话会有什么问题么?
> >
> > 比如 @a = $c->model('X')->all; foreach (@a) { $_ = $_->{_column_data} }
> > 这样。这样的情况是没有 relationship.
> > 有的话,还是去查询 DBIx::Class 的 doc 好了。有个 HashRef 的 模块。
>
> 我的意思是,比如你的
> #$base_mach = [$rs_base_mach->search({'me.app' =>
> 'Penguin'},{join=>'mach_group',prefetch=>'mach_group'})];
> 这里有个 join prefetch
> 然后用 $_ = $_->{_column_data}, 这个 join prefetch 就没了。
> 将 DBIC object 转为 hash 一般是用 HashRefInflator
> 如果行不通的话,就手工转呗。
>
> 大不了这么写
> my $whatIwant = {
> a => $base_mach->a,
> b => $base_mach->b,
> c => $base_mach->c->real,
>
> 之类的。


后来再仔细看明白你的意思。就是简单的引用
噢,后来仔细看那个object的dump结果才明白你的意思了,简单的_column_data确实是没有得到join表的数据。我晕死!!
另外我用了http://lists.scsys.co.uk/pipermail/dbix-class/2008-February/005733.html
给出的patch后,运行基本正常,可以得到hashref了,但是这样对于relationship返回的hashref并不是一个二维的结构体,join关系得到的列还是被嵌套了的。不爽的说!
具体如下,改了一下search:
$base_mach = [$rs_base_mach->search(
{'me.app' => 'Penguin','ip'=>'172.24.68.93'},
{
        join=>'mach_group',
        #prefetch=>'mach_group',
        columns=>[qw/me.app me.cat me.hostname me.ip mach_group.mail_to/]
}
)];
得到:
$VAR2 = [
          {
            'app' => 'Penguin',
            'cat' => 'userdb',
            'mach_group' => {
                              'mail_to' => 'robincui'
                            },
            'ip' => '172.24.68.93',
            'hostname' => 'ABCD'
          }
        ];

折腾这么多,也许你说的对,就手工弄呗。

那个resultset的cursor方法不错。可以直接得到二维的value array。
只是又不知道如何直接得到那些select的column name?
到今天也是刚研究DBIC这个东东3,4天,老实说,不习惯,不是很爽。CDBI大家用过么,好用么?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.pm.org/pipermail/china-pm/attachments/20080318/1f6e2853/attachment-0001.html 


More information about the China-pm mailing list