我的代码很简单:

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

当代码运行时,我得到一条错误消息:“error:id”列中的空值违反了not 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。但是,它似乎没有这样做。我使用这种直接的方式更新其他表,与这个特定的表完全相同(做了必要的修改),并且它对这些其他表很好。但是,这根本不起作用。
有人知道这件事吗?在网上,我看到其他人有一些似乎是相关的问题,但我找不到任何补救措施在网上其他地方的帖子。
有人吗?

最佳答案

我想出来了。问题是在表的类中,从“id”中指定了不同的字段作为主键。代码如下:

primary_key_columns => [ qw( col2 ) ],

(我没有写这段代码)当我把它改成:
primary_key_columns => [ qw( id ) ],

又起作用了。让我烦恼的是为什么这一点一开始就奏效了。它确实在工作,然后我在代码的其他地方做的事情似乎唤醒了Rose::DB,这里出了问题,它停止了工作。
所以,这里的错误不是Rose::DB,而是我们的代码。

关于postgresql - Rose::DB似乎无法识别Postgres序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16503655/

10-12 18:40