Perl Как использовать DBIx::Class для красивого возврата данных

Я новичок в DBIx::Class. Я использую его для API для повторной настройки данных из моей БД, и я хочу воссоздать таблицу SELECT * FROM с помощью DBIC. С 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.
Как я могу получить данные только всех столбцов? Спасибо всем за помощь!


person WastedFreeTime    schedule 01.10.2020    source источник
comment
Суть объектов в том, что они предоставляют функциональность (методы) вместе с данными (атрибутами), желательно в форме организованного и продуманного набора методов. Таким образом, вы обычно просматриваете документы, чтобы найти методы, которые делают то, что вам нужно.   -  person zdim    schedule 02.10.2020
comment
DBIx::Class::ResultSet::HashRef обеспечивает тонкий слой поверх объекта DBIC ResultSet, который удобен для вывода данных в виде структур данных Perl.   -  person GMB    schedule 02.10.2020


Ответы (3)


Data::Dumper просто раскрывает структуру данных. Это сущность объекта DB::Schema::Result::Product, представляющего одну строку таблицы Product.

Если вам нужен красивый результат от объекта, вам нужно попросить объект об этом. Вы можете вызвать для них методы DBIx::Class::Row. Если вам нужны только данные строки из объекта, используйте get_columns или < a href="https://metacpan.org/pod/DBIx::Class::Row#get_inflated_columns" rel="noreferrer">get_inflated_columns. Они возвращают хэш, поэтому вам нужно взять ссылку.

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

Самый простой способ, который я могу придумать, это метод get_inflated_columns.

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

Рассмотрите возможность использования Data::Dump, и если вы действительно хотите что-то красивое, Data::Printer.

person Eduardo Veríssimo    schedule 02.10.2020

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

? Тем не менее, по соглашению поле с подчеркиванием в начале является закрытым полем, которое может быть недокументировано или недостаточно документировано или может быть изменено в будущих реализациях без предварительного уведомления, и вам следует опасаться прямого доступа к ним.

Поскольку смысл DBIx::Class заключается в преобразовании строк базы данных в объекты, вы должны обращаться с набором результатов как с массивом объектов. Чтобы преобразовать его в хэш, подходящий для использования с Data::Dumper, вы можете сделать что-то вроде

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