色々なデータの更新方法その1B!

こんにちわ! yappo です!

7日目は Data::Model でのデータ更新メソッドの説明です。

set

set メソッドを使うと指定したテーブルにデータを INSERT する事が出来ます。

# INSERT INTO user (id,nickname) VALUES(?,?);
# bind: Yappo
    my $row = $bookmark->set(
        user => 1 => { nickname => 'Yappo' }
    );

set メソッドの返り値は INSERT したデータの row オブジェクトとなっていますので

$row->nickname;

と、アクセスする事が可能です。

bulk_insert

現在は bulk_insert 相当のメソッドは用意していませんが、必要に応じて実装する予定です。

find_or_create

find_or_create メソッドを利用することで、

条件にあったレコードが DB に存在するかをチェックし、

DB にデータがなければ INSERT を発行して、結果を row オブジェクトにして返す事ができます。

Data::Model では find_or_create は Mixin での実装になっており、スキーマクラスに

use Data::Model::Mixin modules => ['FindOrCreate'];

という記述が必要です。

ここで MyBookmark.pm の先頭は以下のようになってます。

package MyBookmark;
use strict;
use warnings;
use base 'Data::Model';
use Data::Model::Schema;
use Data::Model::Mixin modules => ['+MyBookmark::Mixin::Count', 'FindOrCreate'];

使い方は以下の通り

    my $row = $bookmark->find_or_create(
        user => 11 => { nickname => 'nekokak' }
    );
    print $row->nickname . "\n";
    $row = $bookmark->find_or_create(
        user => 11 => { nickname => 'nekoya' }
    );
    print $row->nickname . "\n";

実行結果は以下のようになります。

nekokak
nekokak

update

UPDATE メソッドでは既にあるレコードを更新します。

    $bookmark->update(
        user => 1 => undef => { nickname => 'yusukebe' }
    );
    $bookmark->update(
        user => {
            where => [ nickname => 'yusukebe' ],
        } => { nickname => 'youpy' }
    );

一つ目の引数に対象となるテーブル名

二つ目の引数に update 対象となるレコードの primary key

三つ目の引数に update 対象となるレコードの検索条件

四つ目の引数に update する内容

を指定します。

primary key の指定が無いときは二つ目の引数は省略出来ます。

また、rowオブジェクトから直接 update をかける事も出来ます。

    $row->nickname('Yappo');
    $row->update;

row オブジェクトから update をかける場合は table と対象レコードの指定は省略します。

nekokak さんから update_direct を使うかどうかを聞かれたんですが、現在の実装だと update method がいい感じに update_direct を使い分けてくれるのでユーザが呼ぶ必要はなくなっています。

delete

delete メソッドでは既にあるレコードを削除します。

    $bookmark->delete(
        user => 1
    );
    $bookmark->delete(
        user => {
            where => [ nickname => 'nekokak' ],
        },
    );
    $bookmark->delete(
        user => 1 => {
            where => [ nickname => 'Yappo' ],
        },
    );

一つ目の引数に対象となるテーブル

二つ目の引数に update 対象となるレコードの primary key

三つ目の引数に update 対象となるレコードの検索条件

を指定します。

primary key の指定が無いときは二つ目の引数は省略出来ます。

また delete メソッドも update メソッドと同様に row オブジェクトから直接deleteをかける事も出来ます。

$row->delete;

今日は Data::Model の更新系メソッド insert/bulk_insert/update/delete の説明をしました。

have a nice Data::Model days!:)