使い方はそれぞれ

    column 'column_name';
    columns qw/ column_name1 column_name2 column_name3 column_name4 /;

となります。

この使い方は、カラム名だけ引数に与えて与えた引数でのカラム名定義を行ってくれます。

カラム定義を真面目にする

上の簡単な使い方だとカラムの型やら具体的な定義が書かれてないので NOT NULL 制約があるのか何なのか良くわかりません。

そこで、 DBIC とかの良くあるちゃんとした定義を書きます。

これには先の column を利用します。 columns では詳細な定義はできません。

    column column_name
        => int => $options;

このように書きます。

第一引数はカラム名。

第二引数はカラム型。

第三引数がカラムの詳細な定義となります。

カラムの詳細な定義とは、 NOT NULL 制約やら DEFAULT の設定やカラムのサイズなどです。

具体的に定義可能なパラメータは http://search.cpan.org/dist/Data-Model/lib/Data/Model/Schema.pm#COLUMN_OPTIONS に記載してあります。

例えば

    name CHAR(16) NOT NULL

という定義をしたいときは

    column name
        => char => {
            required => 1,
            size     => 16,
        };

という定義を行います。

DEFAULT 値

    name CHAR(16) DEFAULT 'Yappo'

というような DEFAULT の定義をするには

    column name
        => char => {
            default  => 'Yappo',
            size     => 16,
        };

と書けば良いだけなのですが、例えば特定の計算結果(YUID とか)を DEFAULT として入れておきたい場合もあるかと思います。

そんな時は default => sub {} のように CODE リファレンスを書いておくと INSERT するタイミングで CODE リファレンスを実行してくれて、その戻り値を INSERT する用になります。

    my @names = qw/ Yappo nekokak kan /;
    column name
        => char => {
            default  => sub {
                @names[rand(@names)]
            },
            size     => 16,
        };

とかやれば、 Yappo, nekokak, kan のいづれかが DEFAULT として利用されます。

AUTO INCREMENT

さて、いよいよ auto increment の出番です。

といっても、とても簡単で auto_increment => 1 するだけです。

    column id
        => int => {
            required       => 1,
            unsigned       => 1,
            auto_increment => 1,
        };

これだけなんで、とっても簡単ですね。この定義で SQLite と MySQL ともに動きます。

ちなみに unsigned => 1 ってのは INT UNSIGNED ってするだけです。

さて、 MySQL の MyISAM, BDB テーブルでは複合 primary key の二つ目のカラムに AUTO_INCREMENT を指定できます。

http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html

一つ目の値のグーループに対する auto increment をつけてくれるのですが Data::Model で以下のようにスキーマ定義を行ってテーブルを作れば対応可能です。

{
    package TestTable;
    use base 'Data::Model';
    use Data::Model::Schema;
    use Data::Model::Driver::DBI;

    my $driver = Data::Model::Driver::DBI->new(
        dsn => 'dbi:mysql:database=test'
    );
    base_driver $driver;

    install_model auto_increment_test => schema {
        key [qw/ id entry_id /];
        column id
            => int => {
                required => 1,
                unsigned => 1,
            };
        column entry_id
            => int => {
                auto_increment => 1,
                required       => 1,
                unsigned       => 1,
            };
    };
}
print join(";\n", TestTable->as_sqls, '');

使い方は以下の通りで

my $db = TestTable->new;

$db->set( auto_increment_test => 1 );
$db->set( auto_increment_test => 1 );
$db->set( auto_increment_test => 2 );
$db->set( auto_increment_test => 1 );
$db->set( auto_increment_test => 1 );
$db->set( auto_increment_test => 2 );

my $itr = $db->get('auto_increment_test');
while (<$itr>) {
    printf "id = %d, entry_id = %d\n", $_->id, $_->entry_id;
}

結果は下記のようになります。

my $db = TestTable->new;

$db->set( auto_increment_test => 1 );
$db->set( auto_increment_test => 1 );
$db->set( auto_increment_test => 2 );
$db->set( auto_increment_test => 1 );
$db->set( auto_increment_test => 1 );
$db->set( auto_increment_test => 2 );

my $itr = $db->get('auto_increment_test');
while (<$itr>) {
    printf "id = %d, entry_id = %d\n", $_->id, $_->entry_id;
}

まとめ

本日はカラム定義の詳細を書きました。

明日は他のカラム定義を見ていきます。

Wed, 16 Dec 2009 03:40:03 GMT  |  Index

Main Tracks

Yet Anthor Tracks

Other Sites

Powered by nim