DBIx::Class の newメソッドでレコードを作った場合に serial が増分されるタイミング
DBIx::Class で new をつかって新しい行を作っても、insert を実行するまでは serial から id の割り当てはしないらしい。
実験データベース
CREATE TABLE url_path ( id serial PRIMARY KEY, url text UNIQUE, title text not null ); INSERT INTO url_path(url, title) values ('http://www.google.com/', 'Google');
実験スクリプト
package TestDB::Schema; use base qw/DBIx::Class::Schema::Loader/; __PACKAGE__->loader_options(relationships => 1); 1; package main; my $schema = TestDB::Schema->connect("dbi:Pg:dbname=testdb2","","",undef); my $row1 = $schema->resultset('UrlPath')->find_or_new( {url => 'http://www.google.com/'}, {key => 'url_path_url_key'}); print "Row1: ", $row1->id, "\n"; my $row2 = $schema->resultset('UrlPath')->find_or_new( {url => 'http://www.hatena.ne.jp/', title => 'Hatena'}, {key => 'url_path_url_key'} ); print "Row2 before insert:", $row2->id, "\n"; $row2->insert; print "Row2 after insert:", $row2->id, "\n";
結果
% perl find.pl Row1: 1 Row2 before insert: Row2 after insert:2
id があるか無いかで、find_or_new で find と new のどちらがされたか分かる。