[Moscow.pm] DBIx и преобразование типов

Vladimir Timofeev vovkasm на gmail.com
Пн Авг 15 01:28:41 PDT 2011


Флейм:

14 августа 2011 г. 19:54 пользователь iSage <isage на aumi.ru> написал:
> Олег, ежели ключевые слова DBIx и resultset не указывают вам однозначно
> на DBIx::Class, то вряд ли вы сможете по нему помочь.

Например, они могут указывать на DBIx::Resultset с гораздо большей вероятностью.


По делу:

>>
>>
>> 14 августа 2011 г. 9:40 пользователь Ivan Petrov
>> <i.petro.77.00 на gmail.com> написал:
>>> есть таблица в постгрис
>>>
>>> table_name
>>> (
>>>  id SERIAL,
>>>  dt TIMESTAMP NOT NULL DEFAULT NOW()
>>> );
>>>
>>> далее выбираем из нее
>>>
>>> my $row = dbhx->resultset('Name')->find(10);
>>>
>>> далее пишем
>>>
>>> printf "%s\n", $row->dt;
>>>
>>> и печатает дату и время.
>>>
>>> вроде все хорошо.
>>>
>>> но иногда надо, например выбрать только дату
>>>
>>> в SQL это звучало бы так:
>>>
>>>    SELECT id, dt::date FROM table_name;
>>>
>>> или например выбрать только время
>>>
>>> в SQL это звучало бы так:
>>>
>>>
>>>    SELECT id, dt::time FROM table_name;
>>>
>>> либо выбрать время без микросекунд.
>>>
>>>
>>> в MySQL оператор CAST на эту тему трудится
>>>
>>> вопрос: как делать такие выборки с использоанием DBIx? ткните в нужное
>>> место документации

Вот так, например:

my $row = $table_name_rs->search({},{
  'columns' => ['id', {time=>\'me.date::time'},{date=>\'me.date::date'}]
})->first;

Пользоваться полученным объектом можно вот так:

say join(' ', map { $row->get_column($_) } qw/id time date/ );

Есть одно "НО".
Вы теряете при таком использовании почти все плюсы DBICа. Получаемые
из таких resultset'ов объекты, хотя формально принадлежат классам,
определенным вами, по факту таковыми не являются (содержат поля
данных, которых нет в определении, и наоборот - могут не содержать
поля, в определении присутствующие). Так же, для новых полей не
определены преобразования inflate/deflate и они не DateTime.

Имхо, правильней делать таки преобразования в коде (исключения - когда
действительно нужны новые resultset'ы. Если формируется запрос с
группировкой и т.д.)

Для дат, как-то так:
my $row = $table_name_rs->search({})->first;
say $row->id, $row->date->time, $row->date->date;

>>> --
>>> Moscow.pm mailing list
>>> moscow-pm на pm.org | http://moscow.pm.org
>>>
>>
>>
>>
>> --
>> Sincerely yours,
>> Oleg Kostyuk (CUB-UANIC)
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Vladimir Timofeev <vovkasm на gmail.com>


Подробная информация о списке рассылки Moscow-pm