Perl如何使用DBIx::Class漂亮地返回数据

问题描述 投票:0回答:3

我是 DBIx::Class 的新手。我使用它作为 API 来重新调整数据库中的数据,并且我想使用 DBIC 重新创建

SELECT  * FROM table
。有了 DBI,它对我来说效果很好。

让数据“美丽”回归的最佳方法是什么?我想返回哈希数组中的数据,例如:

[
  {
    id => 123,
    name => 'name',
    ....
  }
]

但是随着

my @rs = $schema->resultset('Product')->all;
return \@rs;

我没有得到我想要的输出。在使用 Data::Dumper 检查对象时,我得到以下信息:

$VAR1 = bless( {
              '_column_data' => {
                                  'name' => 'test',
                                  'id' => 123'
                                },
              '_result_source' => $VAR1->{'_result_source'},
              '_in_storage' => 1
            }, 'DB::Schema::Result::Product' );

我确信我误解了DBIC的概念。 如何只获取所有列的数据?

perl dbi dbix-class
3个回答
6
投票

Data::Dumper 只是泄露了数据结构的核心内容。这就是 DB::Schema::Result::Product 对象的内部结构,它代表 Product 表的一行。

如果你想从一个对象中得到漂亮的输出,你需要向该对象询问。您可以对它们调用 DBIx::Class::Row 方法。如果您只需要对象中的行数据,请使用

get_columns
get_inflated_columns
。它们返回一个哈希值,因此您需要引用。

my @rows = map { my %h = $_->get_columns; \%h } @rs;

6
投票

我能想到的最简单的方法是 get_inflated_columns 方法。

map {{$_->get_inflated_columns}} $rs->all

考虑使用 Data::Dump,如果你真的想要一些漂亮的东西,Data::Printer


4
投票
my @rs = map {$_->_column_data} $schema->resultset('Product')->all

?也就是说,按照惯例,带有前导下划线的字段是“私有”字段,可能没有记录或记录不足,或者在未来的实现中可能会发生变化,恕不另行通知,您应该谨慎直接访问它们。

由于

DBIx::Class
的目的是将数据库行转换为对象,因此您应该将结果集视为对象数组。要将其向下转换为适合与
Data::Dumper
一起使用的哈希值,您可以执行类似的操作

my @rs = map { { name => $_->name, id => $_->id } } $schema->resultset('Product')->all
© www.soinside.com 2019 - 2024. All rights reserved.