1

我的代码很简单:

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

代码运行时,我收到错误消息“错误:“id”列中的空值违反非空约束”。错误消息还表明错误所在的行是“$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 回答