m_shige1979のときどきITブログ

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

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

https://github.com/mshige1979

PerlでTengを使用したDB操作2

MVCのモデルみたいな感じにしようと画策中

データベースを接続する際は毎回接続するのはちょっと面倒臭いのでなんか1つの場所で接続して使用した方がいいはず。

構成

.
├── config.pl
├── lib
│   ├── Config
│   │   └── App.pm
│   ├── DB
│   │   └── Schema.pm
│   ├── DB.pm
│   ├── Model
│   │   ├── App.pm
│   │   └── Posts.pm
│   └── Model.pm
└── sample.pl

設定

config.pl
{
    connect_info => [ 'dbi:mysql:sample_db1:localhost', 'root', undef ]
}

Config

Config::App.pm
package Config::App{
    use Mouse;
    use Config::PL;

    sub config{
        return config_do "config.pl";
    }

    __PACKAGE__->meta->make_immutable();
}

1;

※Config::PLでconfig.plを読み込む

DB

DB.pm
package DB;
use parent 'Teng';
1;
DB::Schema.pm
package DB::Schema;
use strict;
use warnings;
use Teng::Schema::Declare;

table{
    name 'posts';
    pk   'id';
    columns qw/id title body/;
};

1;

Model

Model.pm
package Model{
    use Mouse;
    use DB;
    use Config::App;

    has 'db' => (
        is => 'ro',
        isa => 'DB',
        lazy_build => 1
    );

    has 'connect_info' => (
        is => 'ro',
        isa => 'ArrayRef',
        lazy_build => 1
    );

    sub _build_connect_info{
        my $self = shift;
        Config::App::config->{connect_info};
    }

    sub _build_db{
        my $self = shift;

        DB->new(
            connect_info => $self->connect_info
        );

    }

    __PACKAGE__->meta->make_immutable();
}

1;
Model::App.pm
package Model::App{
    use Mouse;
    use Model;

    extends Model;

    has 'table' => (
        is => 'ro',
        isa => 'Str',
    );

    sub find{
        my ($self) = @_;

        my $data;
        $data = $self->db->single($self->table, {});
        return $data;

    }

    __PACKAGE__->meta->make_immutable();

}

※Model.pmを継承して

Model::Posts
package Model::Posts{
    use Mouse;
    use Model::App;

    extends Model::App;

    has 'table' => (
        is => 'ro',
        isa => 'Str',
        default => 'posts'
    );

    __PACKAGE__->meta->make_immutable();

}

※Model::Postsでテーブルを指定

実行ソース

#!/usr/bin/env perl
use strict;
use warnings;

use FindBin;
use lib "$FindBin::Bin/lib";
use Data::Dumper;

use Model::Posts;

my $model = new Model::Posts();
my $data = $model->find();


print Dumper($data->id, $data->title, $data->body);

[vagrant@localhost teng2]$ perl sample.pl 
$VAR1 = '2';
$VAR2 = 'test2';
$VAR3 = 'body2';
[vagrant@localhost teng2]$

こんな感じかな?
機能やテーブルなどをうまく調整してメソッドを別途実装して個別対応していくことになるかも…
基本、phpjavaしか知らないからそれぞれの言語に合わせた実装を理解する必要があります。

まとめ

perlを使用したModuleの使用にはまだ慣れていないけどなんとか形になってきた感じ。
何度も書いて検証を続けていかないと
ちょっとMojoliciousのサンプルで動かせるかなども検証する必要がある