ziguzagu.org

DBIx::Class

DBIx::Classを恐る恐るさわってみるてすと。

テスト用のテーブル。

+-------+----------+------+-----+---------------------+----------------+
| Field | Type     | Null | Key | Default             | Extra          |
+-------+----------+------+-----+---------------------+----------------+
| id    | int(11)  |      | PRI | NULL                | auto_increment |
| title | text     |      |     |                     |                |
| body  | text     |      |     |                     |                |
| mtime | datetime |      |     | 0000-00-00 00:00:00 |                |
+-------+----------+------+-----+---------------------+----------------+

まず、根っこにあたるクラス(この解釈が微妙)。

package My::DB;
use strict;
use warnings;
use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_classes(qw/Memo/);

1;

Schemaベース。Class::DBIの根っこになるクラスの雰囲気で書こうと思ったらちょっと違った。

いいや、次。memoテーブルにマッピングするクラス。

package My::DB::Memo;
use strict;
use warnings;
use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw/PK::Auto::MySQL Core/);
__PACKAGE__->table('memo');
__PACKAGE__->add_columns(qw/id title body mtime/);
__PACKAGE__->set_primary_key('id');

1;

load_components以外はClass::DBIにも同じもの/よく似たものがある風景。 PK::Auto::MySQLはPK::AutoのMySQL版だそうで、(DBIx::Class::)PK::Autoは、

This class overrides the insert method to get automatically incremented primary keys.

というものだそうです。MySQLのauto_incrementにあたるものをやってくれる感じ。ソースみてもそんな感じ。

次にこいつらを使って単純なCRUDやるintro.pl。inflate/deflateのやり方はまだなので、日付はとりあえずTime::Pieceつかって生文字列を入れようとしてみる。

#!/usr/bin/perl
use strict;
use warnings;
use lib "lib";
use My::DB;
use Time::Piece::MySQL;

my $schema = My::DB->connect('dbi:mysql:test', 'test', '');
my $memo   = $schema->resultset('Memo');

my $time = localtime;

### insert
my $item = $memo->create({
    title   => 'Hello',
    body    => 'World',
    mtime   => $time->mysql_datetime,
});
my $id = $item->id;

### select
$item = $memo->find($id);
print join "\n", $item->id, $item->title, $item->body, $item->mtime, "\n";

### update
$item->body($item->body . "!!!");
$item->update;

### delete
$item = $memo->find($id);
print join "\n", $item->id, $item->title, $item->body, $item->mtime, "\n";
$item->delete;

Class::DBIとはおもむきが違うようでにているようで。というか、CDBIとDBICの決定的な違いが理解できてないわけですが、この2つって使い分けるものなんでしょうか…?

とにかく慣れよ。

参考。