Rose :: DB似乎不认识Postgres序列

时间:2013-05-12 02:32:46

标签: postgresql rose-db-object

我的代码很简单:

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

当代码运行时,我收到错误消息“ERROR:列中的空值”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。但是,似乎没有这样做。我使用这种直接更新其他表的方式与此特定表( mutatis mutandis )完全相同,并且它适用于其他表。但是,这里根本就没有用。

有人对此有任何想法吗?在网上看,我看到其他人已经有了相关的问题,但我在网上其他地方找不到任何补救措施。

任何人

1 个答案:

答案 0 :(得分:1)

我明白了。问题是在我的表类中,一个不同的字段被指定为“id”的主键。代码如下:

primary_key_columns => [ qw( col2 ) ],

(我没有写过这段代码。)当我把它改成:

primary_key_columns => [ qw( id ) ],

它再次起作用。困扰我的是为什么这首先起作用。这肯定是有效的,然后我在代码中的其他地方做的东西似乎唤醒了Rose :: DB这里出了问题并且它停止了工作。

所以,错误不在于Rose :: DB,而在于我们的代码。