1

私のコードは簡単です:

eval {
    my $item = $_table1_class->new(
        field1 => $val1,
        field2 => $val2,
        field3 => $val3,
    );
    $item->save;
};
if ($@) {
   .
   .
   .
   # Error handling stuff.
   .
   .
   .
}

コードを実行すると、「エラー: 列 "id" の null 値が null 以外の制約に違反しています」というエラー メッセージが表示されます。エラー メッセージは、エラーが含まれている行が "$item->save;" であることも示しています。ライン。

書き込もうとしている PostgreSQL データベース テーブルには、field1、field2、および field3 に加えて id フィールドがあります。id フィールドは次のように定義されます。

id | integer | not null default | nextval('table1_id_seq'::regclass)

これは、このテーブルの Rose::DB 用に定義したクラスのコードに反映されています。このテーブルの id フィールドには、次のコードがあります。

id => { 
     type => 'serial', 
     not_null => 1, 
     primary_key => 1, 
     sequence => 'table1_id_seq', 
},

ここで何が間違っている可能性がありますか?

奇妙なことは、これが今朝すべて機能していたことです。これにまったく影響を与えないはずのものを変更しましたが、機能しなくなりました。私は一日中髪を引っ張っています。Rose::DB が PostgreSQL にシーケンスから ID を作成させる必要があることは明らかです。しかし、これはしていないようです。この特定のテーブルとまったく同じように他のテーブルを更新するこの簡単な方法を使用し (必要な変更を加えて)、これらの他のテーブルに対して正常に機能します。しかし、ここでは単に機能していません。

これについて何か考えがある人はいますか?ネットを見ると、他の人が関連する問題を抱えているように見えますが、ネット上の他の投稿では解決策を見つけることができません.

誰か?

4

1 に答える 1

1

私はそれを考え出した。問題は、テーブルのクラスで、「id」とは異なるフィールドが主キーとして指定されていたことです。コードは次のとおりです。

primary_key_columns => [ qw( col2 ) ],

(私はこのコードを書いていませんでした。)これを次のように変更したとき:

primary_key_columns => [ qw( id ) ],

それは再び働いた。私が気になるのは、なぜこれが最初に機能したのかということです。それは間違いなく機能していましたが、コードの他の場所で行ったことが Rose::DB を目覚めさせ、ここで何かが間違っているように見え、機能しなくなりました。

したがって、実際には Rose::DB に問題があるのではなく、私たちのコードに問題がありました。

于 2013-05-12T15:51:14.687 に答える