introduction Data::ModelB!

はじめに

居酒屋大好き Yappo です。今年の Yet Another JPerl Advent Calendar 2009 として Data::Model のトラックを始める事にしました。

姉妹トラックとしてnekokakさんによるDBIx::Skiny trackも開催されています。

JPerl Advent Calendar 2009 のリポジトリで cp -r data/hacker data/foo && git add data/foo && git push するだけでオレオレトラック開催出来るので、なにかやりたい人or団体さんはトラック作るといいよ!

このトラックの目的

Data::Model トラックでは、 POD や Data::Model::Tutorial::JA - http://search.cpan.org/dist/Data-Model/lib/Data/Model/Tutorial/JA.pm で説明しきれていないトピックを細く短く25日間お伝えします。

Data::Modelってなに?

一言で言うと O/R Mapper です。

Data::ObjectDriver を始めとして Jifty::DBI, Fey::ORM, DBIx::MoCo, Rose::DB, DBIx::Class, DBIx::Skinny 等を参考にして開発されています。

特徴として

  • KVS 指向の Interface
  • DBI 以外のストレージにスキーマデータを保存出来る (例えば Tokyo Tyrant とかの Memcached プロトコルのストレージ)
  • 透過キャッシュ
  • Mixin によるスキーマクラスの拡張
  • Q4M 対応
  • 標準で relationship に未対応

パフォーマンスについては DBIx::Skinny と同等というベンチマークを nekokak さんが出してくれました。

DBIx::Skinny は DBIx::Class より数倍速いという話です。

install

CPAN - http://search.cpan.org/dist/Data-Model/ からインストールも出来ますし、 git - http://github.com/yappo/p5-Data-Model でもいいです。

$ cpan Data::Model
$ git clone git://github.com/yappo/p5-Data-Model.git
$ cd p5-Data-Model
$ perl Makefile.PL
$ make install

公式 irc channel として #data-model@irc.perl.org が用意されています。

つかってみよう

さっそく Data::Model を使ってみます。とても簡単です。

データストアには SQLite を使いましょう。

スキーマ定義

まずはスキーマ定義です。

Data::Model を継承して、 Data::Model::Schema を use する事によりスキーマ作成を行う為の DSL をインストールします。

package MyBookmark;
use strict;
use warnings;
use base 'Data::Model';
use Data::Model::Schema;
use Data::Model::Driver::DBI;

my $driver = Data::Model::Driver::DBI->new(
    dsn => 'dbi:SQLite:dbname=mybookmark.db', '', ''
);
base_driver $driver;

install_model user => schema {
    key 'id';
    columns qw/ id nickname /;
};

1;

id という primary key のカラムと nickname というカラムを持った user テーブルを一つだけ作った定義です。

base_driver という所で、 DBI ドライバーを使って SQLite を使って mybookmark.db にデータベースを作るという事を指定しています。

base_driver という指定は、ここに書かなくても問題無いですが簡潔な説明の為に一緒に書いてあります。

CREATE TABLE 文発行

スキーマの定義が出来たら、 CREATE TABLE 文を発行してテーブルをセットアップします。

$ perl -MMyBookmark -e 'print join ";\n", MyBookmark->as_sqls, ""' | sqlite3 mybookmark.db

Data::Model ではスキーマ定義も全部スキーマクラス上で行える事を想定して設計されているので、別途 CREATE TABLE 文を用意する必要はありません。

使ってみよう

よく有る ORM の使い方で Data::Model も利用できます。

# 01.pl
use strict;
use warnings;
use MyBookmark;

my $bookmark = MyBookmark->new;

# id = 1, nickname = 'Yappo' で user テーブルにレコードを作成
$bookmark->set(
    user => 1 => {
        nickname => 'Yappo',
    },
);

# SELECT * FROM user WHERE id = 1; してレコードを一件取得
my $row = $bookmark->lookup( user => 1 );
print sprintf "ID: %d\nNICKNAME: %s\n", $row->id, $row->nickname;

# 取得したレコードを DELETE 文で削除
$row->delete;

実行結果は下記の通り

$ perl 01.pl
ID: 1
NICKNAME: Yappo

まとめ

今日は Data::Model をインストールして、実際にレコードの出し入れする所までやりました。

明日は、カラム定義に少し突っ込みます。