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