色々なデータの更新方法その1
こんにちわ! 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!:)