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 のどちらがされたか分かる。