罗斯::D B似乎不认识Postgres序列



我的代码很简单:

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

当代码运行时,我得到错误消息,"error:列"id"中的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,而是我们的代码。

相关内容

  • 没有找到相关文章

最新更新