Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. モジュール
  3. データベース
  4. DBIx::Custom
  5. here

DBIx::Customの「update」メソッドで行を「更新」する

テーブルの行を更新するにはupdateメソッドを使用します。

$dbi->update(
  {title => 'Perl', author => 'Ken'},
  table => 'book',
  where => {id => 1},
);

第一引数には更新のためのデータをハッシュリファレンスで指定します。対象のテーブルをtableで指定します。更新する行の条件をwhereで指定します。whereにはハッシュリファレンスか、DBIx::Custom::Whereオブジェクトを指定することができます。次のようなSQLが発行されます。

update book set title = ?, author = ? where id = ?;

対応する値がプレースホルダに埋め込まれます。

またスカラリファレンスを値として渡すと、SQLの中にそのまま埋め込むことができます。

{date => \"NOW()"}

updateメソッドのオプション

updateメソッドは「execute」メソッドのすべてのオプション]を使用することができ、新しく以下のオプションが利用できます。executeのオプションについては「executeメソッド」のオプションの項目を参考にしてください。

IDによる条件指定 id

IDによる条件指定を行うにはidオプションを使用します。primary_keyオプションが指定されている必要があります。

id => 4
id => [4, 5]

たとえば以下のupdate文を実行するとします。

$dbi->update(
  {title => 'Perl', author => 'Ken'}
  primary_key => ['id1', 'id2'],
  id => [4, 5],
  table => 'book'
);

これは以下のupdate文と同じ意味になります。

$dbi->update(
  {title => 'Perl', author => 'Ken'}
  where => {id1 => 4, id2 => 5},
  table => 'book'
);

プレフィックス prefix

updateとテーブル名の間に文字列を追加することができます。

prefix => 'or replace'

たとえば以下のようなSQL文を実行することができます。

update or replace book

テーブル名 table

tableオプションでテーブル名を指定します。

table => 'book'

更新時に現在時刻を設定 mtime

更新時に更新時刻を更新するには、mtimeオプションで更新時を格納する列名を指定します。

mtime => 'modified_time'

デフォルトのフォーマットは「YYYY-mm-dd HH:MM:SS」です。これはnow属性によって変更することができます。

Where句 where

Where句を記述するにはwhereオプションを使用します。

where => {author => 'Ken', 'title' => 'Perl'}
where => [
  ['and', ':author{=}', ':title{like}'],
  {author => 'Ken', title => '%Perl%'}
]

whereオプションの指定方法については「selectメソッド」のwhereオプションを見てください。Where句の生成の詳細については動的なWhere句の生成を見てください。

プレースホルダーのラッピング wrap

update文のsetの部分のプレースホルダーの部分を編集したい場合はwrapオプションを使用します。

wrap => {price => sub { "max($_[0])" }}

たとえば次のようなupdateを実行したとします。

$dbi->update(
  {price => 100},
  table => 'book',
  where => {id => 1}
  wrap => {price => sub { "$_[0] + 5" }}
);

以下のようなSQLが実行されます。

update book set price = ? + 5 where id = 1

すべての行の更新 update_all

テーブルのすべての行を更新するにはupdate_allメソッドを使用します。安全のためにupdateメソッドでは、行のすべての更新を許可してないので、代わりにupdate_allメソッドを使用します。

$dbi->update_all({title => 'Perl', author => 'Ken'}, table => 'book');

第一引数に更新のためのデータをハッシュリファレンスで指定します。対象のテーブルをtableで指定します。次のようなSQLが発行されます。

update book set title = ?, author = ?;

対応する値がプレースホルダに埋め込まれます。

Giblog