DBIC::PK::Auto によるオートインクリメントフィールドの取り扱い

MySQL の AUTO INCREMENT 属性フィールドや PostgreSQL の SERIAL フィールドは,テーブルを挿入すると自動的に値をカウントアップして挿入してくれるタイプのフィールドです。SQLite では,フィールドを INTEGER PRIMARY KEY にして INSERT の際にそのフィールドに値を与えないと同じような挙動になります。SQLite では挿入後のカウンタは,$dbh->last_insert_rowid で取得します(SQLite ライブラリの API です)。MySQLPostgreSQL ではシーケンスを SELECT して取得します。

このように,DB によって自動インクリメント値の取り扱いが違うのですが,その差を DBIC で吸収してくれるのが PK::Auto プラグインです。

package My::Schema::Test;
use base qw/DBIx::Class/;
__PACKAGE__->table('t_test);
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->add_columns(qw/id name/);
__PACKAGE__->set_primary_key('id');

のように該当テーブルのスキーマ定義で PK::Auto を読み込むようにし,プライマリキーを指定します。

$rs = My::Schema->resultset('t_test')->create(name => 'foo bar');
print $rs->id, "\n";

とすると,挿入後に割り当てられたインクリメント値を取得することができます。ちなみに PK::Auto しないと $rs->id は undef のままです。

SQL::Translator でコンバートしたスキーマ定義モジュールでは PK::Auto を自動的につけてくれないので,手で書き加えなければならないところが要注意です。