Rose::DB не распознает последовательность Postgres
Мой код прост:
eval {
my $item = $_table1_class->new(
field1 => $val1,
field2 => $val2,
field3 => $val3,
);
$item->save;
};
if ($@) {
.
.
.
# Error handling stuff.
.
.
.
}
Когда код запускается, я получаю сообщение об ошибке: "ОШИБКА: нулевое значение в столбце" id "нарушает ограничение not-null". Сообщение об ошибке также указывает, что строка, в которой находится ошибка, является "$item->save;" линия.
Таблица базы данных PostgreSQL, в которую я пытаюсь записать, имеет поле id в дополнение к field1, field2 и field3. Поле 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 для создания идентификатора из последовательности. Но, похоже, этого не происходит. Я использую этот простой способ обновления других таблиц точно так же, как эта конкретная таблица (mutatis mutandis), и он отлично работает для этих других таблиц. Но здесь это просто не работает.
У кого-нибудь есть идеи по этому поводу? Глядя на сеть, я вижу, что у других были проблемы, которые кажутся связанными, но я не могу найти никакого решения в сообщениях в других местах в сети.
Кто-нибудь?
1 ответ
Я понял. Проблема заключалась в том, что в моем классе для таблицы было указано другое поле в качестве первичного ключа от "id". Код гласил:
primary_key_columns => [ qw( col2 ) ],
(Я не писал этот код.) Когда я изменил это на:
primary_key_columns => [ qw( id ) ],
Это снова сработало. Что меня беспокоит, так это то, почему это сработало. Это определенно работало, а то, что я делал в другом месте кода, похоже, разбудило Rose::DB, что что-то здесь не так, и оно перестало работать.
Таким образом, ошибка была не в Rose::DB, а в нашем коде.