Teng::Plugin::SearchBySQLAbstractMoreを試す
いろいろなモジュールがある
どれを使用することが正しいのかなんてわからないので適当にネットで検索したものを使用することにする
今回は集計とかしたかったので「Teng::Plugin::SearchBySQLAbstractMore」を検索しました
準備
cpanm
cpanm Teng::Plugin::SearchBySQLAbstractMore
構成
. ├── lib │ ├── DB │ │ └── Schema.pm │ └── DB.pm ├── sample1.pl
ソース
lib/DB/Schema.pm
package DB::Schema; use strict; use warnings; use Teng::Schema::Declare; table{ name 'posts'; pk 'id'; columns qw/id title body date age/; }; 1;
※これはいつもどおり
lib/DB.pm
package DB; use parent 'Teng'; __PACKAGE__->load_plugin('SearchBySQLAbstractMore'); 1;
※プラグインをロードする
sample1.pl
#/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use DB; use Data::Dumper; my $obj; $obj = DB->new( connect_info => ['dbi:mysql:sample_db3:localhost', 'root', undef ] ); # 参照 my $data = $obj->search_by_sql_abstract_more( 'posts', +{ # 条件指定 age => +{">=" => "25"} }, +{ # カラム -columns => [ 'id' , 'title as bbb' , 'body as ccc' , 'date' , 'age' ], # 件数制御 -limit => 3, # 並べ替え -order_by => [ 'age DESC', 'id ASC' ], } ); while(my $row = $data->next()){ print Dumper($row->{row_data}) . "\n"; }
※パラメータの3つ目に追加の並べ替えやカラム名を設定
これでイケるらしい
distinctなどでユニークな行1件のみにしたい場合
#/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use DB; use Data::Dumper; my $obj; $obj = DB->new( connect_info => ['dbi:mysql:sample_db3:localhost', 'root', undef ] ); # 参照 my $data = $obj->search_by_sql_abstract_more( 'posts', +{ # 条件指定 age => +{">=" => "10"} }, +{ # カラム -columns => [ 'distinct date as date' ], # 件数制御 -limit => 3, # 並べ替え -order_by => [ 'date DESC' ], } ); while(my $row = $data->next()){ print Dumper($row->{row_data}) . "\n"; }
※distinctなどを指定することもできる
group by
#/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use DB; use Data::Dumper; my $obj; $obj = DB->new( connect_info => ['dbi:mysql:sample_db3:localhost', 'root', undef ] ); # 参照 my $data = $obj->search_by_sql_abstract_more( 'posts', +{ # 条件指定 age => +{">=" => "10"} }, +{ # カラム -columns => [ 'date', 'count(date) as count', 'sum(age) as sum' ], # 件数制御 -limit => 3, # グループ -group_by => [ 'date' ], # グループ条件 -having => [ 'count' => {">=" => 3} ], # 並べ替え -order_by => [ 'date DESC' ], } ); while(my $row = $data->next()){ print Dumper($row->{row_data}) . "\n"; }
※グループ指定も可能
所感
searchメソッドではちょっとやりにくい場所もこれでできるようになった。あまりこういうのには手間を掛けたくないので
簡単に記載できるのは嬉しい。
モジュールを使用するのは便利だが、学習コストなどで手間がかかるのはやめたいとは思う
参考
鈍足ランナーのIT日記 Tengでgroup byやDateTimeをWhere句に書く方法
https://metacpan.org/pod/Teng::Plugin:
Teng::Plugin::SearchBySQLAbstractMore リリース - Practice of Programming
ソースみたけどよくわからんかった
うーん、勉強せな…
「−」がなんでキーについてんだよ、意味不明だ…