我的代码很简单:
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,而是我们的代码。