コードを舐める日々

でざいんがいいかんじです

DBIx::Skinny を使ってみた

# 間違いなどあれば指摘をお待ちしています。
DBIx::Skinny は Perl で書かれた ORマッパーのモジュールである。
SQLite3 としてどうかくかは id:nekokak さんの記事を参考にできたが、 MySQL としてどう書けばいいか結構行き詰まったのでメモ。
# そりゃうちのコードリーティング不足だな。

MySQL の基本情報

user: user
password: example
host: localhost
port: 3306
DB: test

サンプルテーブル(WebMemo)

CREATE TABLE webmemo (
    id INT(10) NOT NULL AUTO_INCREMENT,
    title VARCHAR(20) NOT NULL,
    body TEXT NOT NULL,
    created_at TIMESTAMP,
    updated_at TIMESTAMP,
    PRIMARY KEY ( id )
);

DBIx::Skinny でテーブル操作

まず、WebMemo/DB のようにフォルダを作ります。
作ったら、 DB フォルダの中に DBIx::Skinny クラスを継承した下記のクラス( DB.pm )を作成します。

package WebMemo::DB;
use DBIX::Skinny;

1;

Package WebMemo::DB::Schema;
use DBIx::Skinny::Schema;

install_table webmemo => schema {
    pk 'id';
    columns qw/ id title body created_at updated_at /;
};

1;

実際にその DB.pm を使って INSERT 等をします。

test.pl

#!/usr/bin/perl;

use strict;
use warnings;
use lib './lib';
use WebMemo::DB;

my $db = WebMemo::DB->new;
$db->connect(
    {
        dsn      => 'dbi:mysql:test',
        username => 'root',
        password => 'example'
    }
);

# INSERT INTO webmemo (title, body ), VALUES ('test', 'http://example.com');
# を実行
my $row = $db->create('webmemo',
    {
        title => 'test',
        body  => 'http://example.com',
    }
);

print $row->id, "\n";
print $row->title, "\n";
print $row->body, "\n";

# UPDATE webmemo set title = 'test2' WHERE id = 1;
# を実行
# $row->update({title => 'test2'});でも同じ
#$db->update('webmemo',{title => 'test2'}, {id => $row->id});

# SELECT * FROM webmemo WHERE title = 'test2'
# を実行
$row = $db->search('webmemo', {title => 'test2'})->first;
print $row->id, "\n";
print $row->title, "\n";
print $row->body, "\n";

# SELECT * FROM webmemo limit 1;
# を実行
$row = $db->single('webmemo');
print $row->id, "\n";
print $row->title, "\n";
print $row->body, "\n";

# DELETE FROM webmemo WHERE id = 1;
# を実行
$row = $db->single('webmemo');
$db->delete('webmemo',{id => $row->id});

追記:id:nekpkak さんに間違いがあった部分を指摘されたので修正します。
http://d.hatena.ne.jp/nekokak/20100128/1264682072
というかこれくらい気付けw 恥ずかしい。。
id:nekokak さん、ありがとうございます。
dsn の部分、 windows で上記のように書いたときはちょっと動かなかったような。

$db->contact(
    {
        dsn => 'dbi:mysql:test;user=root;password=example;'
    }
);

って感じで書いてみたら動いたんです。。

自宅はMac、Linux環境で試せてないんですが、書き方って変りないのかなぁ。
明日会社で試してみる。



再追記:Windows でも上記の書き方でOKです。