【问题标题】:Perl How to use DBIx::Class to return data beautifullyPerl 如何使用 DBIx::Class 漂亮地返回数据
【发布时间】:2021-01-17 14:33:30
【问题描述】:

我是 DBIx::Class 的新手。我将它用于 API 以从我的数据库中重新调整数据,我想用 DBIC 重新创建一个 SELECT * FROM 表。使用 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 的概念。
如何仅获取所有列的数据?谢谢大家的帮助!

【问题讨论】:

  • 对象的重点在于它们提供功能(方法)以及数据(属性),希望以有组织和经过深思熟虑的方法集的形式。因此,您通常会浏览文档以找到满足您需要的方法。
  • DBIx::Class::ResultSet::HashRef 在 DBIC ResultSet 对象之上提供了一个薄层,可以方便地将数据输出为 Perl 数据结构。

标签: perl dbi dbix-class


【解决方案1】:
my @rs = map {$_->_column_data} $schema->resultset('Product')->all

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

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

my @rs = map { { name => $_->name, id => $_->id } } $schema->resultset('Product')->all

【讨论】:

    【解决方案2】:

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

    如果你想从一个对象中获得漂亮的输出,你需要向这个对象询问。您可以在它们上调用DBIx::Class::Row 方法。如果您只需要对象中的行数据,请使用get_columnsget_inflated_columns。他们返回一个哈希,所以你需要参考。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-25
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 2017-05-17
        相关资源
        最近更新 更多