我的代码很简单:
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 )完全相同,并且它适用于其他表。但是,这里根本就没有用。
有人对此有任何想法吗?在网上看,我看到其他人已经有了相关的问题,但我在网上其他地方找不到任何补救措施。
任何人
答案 0 :(得分:1)
我明白了。问题是在我的表类中,一个不同的字段被指定为“id”的主键。代码如下:
primary_key_columns => [ qw( col2 ) ],
(我没有写过这段代码。)当我把它改成:
primary_key_columns => [ qw( id ) ],
它再次起作用。困扰我的是为什么这首先起作用。这肯定是有效的,然后我在代码中的其他地方做的东西似乎唤醒了Rose :: DB这里出了问题并且它停止了工作。
所以,错误不在于Rose :: DB,而在于我们的代码。