m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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

ソースみたけどよくわからんかった
うーん、勉強せな…

「−」がなんでキーについてんだよ、意味不明だ…